我正在使用 运行一些 node.js 脚本forever
。
我以用户身份启动它们www-data
(即通过 ssh 以 www-data@server 身份登录并输入forever start myapp.js
等)。
好的,一切都很顺利;我的应用程序按预期工作,并且输入内容forever list
可以显示正在运行的进程。
然后,我编写了一个(非常简单的)脚本foreverList.sh
,并将其命名为文件夹/var/www/scripts/
:
#!/bin/bash
echo "checking running node.js scripts:"
forever list
当我以用户身份从 shell 执行脚本时www-data
,它可以正常工作。这里没有什么特别的。但是,此脚本应与 PHP 5.6 到 Apache 2.4 一起使用,并且:
<?php
// ....
$resp_script = shell_exec("/var/www/scripts/foreverList.sh 2>&1");
echo "<pre>$resp_script</pre>";
当我通过 Web 浏览器执行它时(使用上面的 PHP 代码),它不起作用!!我收到此forever
错误消息(nodejs,而不是 php):
/usr/lib/node_modules/forever/lib/forever.js:674
procs.forEach(function (proc) {
^
TypeError: Object Error: EACCES, permission denied '/root/.forever/sock' has no method 'forEach'
...
... #(stack trace follows)
我真的不明白为什么它要处理 /root 文件夹,因为我正在从 /var/www/ 文件夹以www-data
用户身份运行所有这些东西(whoami
在脚本中添加了 a 来检查是否如此,结果确实如此)。
我是不是漏掉了什么?这是一个永久的错误吗?
任何帮助都感激不尽。
更新:我尝试echo $HOME
在 bash 脚本中添加,但它没有返回任何内容。PHP 本身是否会清除www-data
用户的 home path 环境变量?
答案1
好吧,我终于找到了解决方案。
实际上,Apache 取消了$HOME
环境变量的设置,(参见/etc/apache2/envvar
文件 第 4 行unset HOME
:)
唯一要做的就是添加:
export HOME=/var/www
forever list
在 Bash 脚本中的行之前。
而且效果非常好。