从PHP脚本启动FOREVER或PM2作为WWW-DATA

我有一个名为script.jsnodejs脚本。

 var util = require('util'); var net = require("net"); process.on("uncaughtException", function(e) { console.log(e); }); var proxyPort = "40000"; var serviceHost = "1.2.3.4"; var servicePort = "50000"; net.createServer(function (proxySocket) { var connected = false; var buffers = new Array(); var serviceSocket = new net.Socket(); serviceSocket.connect(parseInt(servicePort), serviceHost); serviceSocket.pipe(proxySocket).pipe(serviceSocket); proxySocket.on("error", function (e) { serviceSocket.end(); }); serviceSocket.on("error", function (e) { console.log("Could not connect to service at host " + serviceHost + ', port ' + servicePort); proxySocket.end(); }); proxySocket.on("close", function(had_error) { serviceSocket.end(); }); serviceSocket.on("close", function(had_error) { proxySocket.end(); }); }).listen(proxyPort); 

我正在像nodejs script.js一样运行它,但是现在我想要包含foreverpm2function。 当我是root一切顺利:

 chmod -R 777 /home/nodejs/forever/; -- give rights watch -n 0.1 'ps ax | grep forever | grep -v grep' -- watch forwarders (where i see if a forever is opened) /usr/local/bin/forever -d -v --pidFile "/home/nodejs/forever/file.pid" --uid 'file' -p '/home/nodejs/forever/' -l '/home/nodejs/forever/file.log' -o '/home/nodejs/forever/file.log' -e '/home/nodejs/forever/file.log' -a start /etc/dynamic_ip/nodejs/proxy.js 41789 1.2.3.4:44481 414 file -- open with forever forever list -- it is there, i can see it forever stopall -- kill them all 

问题是,当我想要从systemexecfunction的PHP脚本运行脚本:

 sudo -u www-data /usr/local/bin/forever -d -v --pidFile "/home/nodejs/forever/file.pid" --uid 'file' -p '/home/nodejs/forever/' -l '/home/nodejs/forever/file.log' -o '/home/nodejs/forever/file.log' -e '/home/nodejs/forever/file.log' -a start /etc/dynamic_ip/nodejs/proxy.js 41789 1.2.3.4:44481 414 file -- open as www-data (or i can do this just by accessing `http://1.2.3.4/test.php`, it is the same thing) forever list -- see if it is there, and it is not (i see it in watch) forever stopall -- says no forever is opened kill PID_ID -- the only way is to kill it by pid ... and on another server all of this works very well, can create and kill forevers from a php script when accessing it from web ... not know why -- everything is in /etc/sudoers including /usr/local/bin/forever 

这是为什么? 我如何解决这个问题?

我也做了一些技巧,创build了一个用户'forever2',我创build了一个script.sh这个内容:

 sudo su forever2 user123; /usr/local/bin/forever -d -v --pidFile "/home/nodejs/forever/file.pid" --uid 'file' -p '/home/nodejs/forever/' -l '/home/nodejs/forever/file.log' -o '/home/nodejs/forever/file.log' -e '/home/nodejs/forever/file.log' -a start /etc/dynamic_ip/nodejs/proxy.js 41789 1.2.3.4:44481 414 file; 

user123不存在的地方,只是在执行后退出shell一个技巧。 脚本工作, forever运行,我可以closures所有forevers forever stopallroot的命令。 当我尝试运行http://1.2.3.4/test.php相同的东西或作为www-data用户我不能closures它从rootwww-data ,甚至没有这个工程。

我尝试从Ubuntu 14.04.3 LTSUbuntu 14.04 LTSDebian GNU/Linux 8 …仍然是同样的事情。

任何ideeas?

谢谢。

Solutions Collecting From Web of "从PHP脚本启动FOREVER或PM2作为WWW-DATA"

如果从Apache或Web服务器启动进程,则您已经是www-data用户,因此对已有的用户环境执行sudo su可能不是必需的。

当你开始这个forever任务时,你可能还需要关闭终端/输入并直接发送到后台。 像这样的东西:

 // Assemble command $cmd = '/usr/bin/forever'; $cmd.= ' -d -v --pidfile /tmp/my.pid'; // add other options $cmd.= ' start'; $cmd.= ' /etc/dynamic_ip/nodejs/proxy.js'; // "magic" to get details $cmd.= ' 2>&1 1>/tmp/output.log'; // Route STDERR to STDOUT; STDOUT to file $cmd.= ' &'; // Send whole task to background. system($cmd); 

现在,这里不会有任何输出,但是你应该在/tmp/output.log中有一些东西可以显示为什么forever失败,或脚本崩溃。

如果您有时以root身份运行脚本,那么使用与www-data相同的命令,您也可能正在运行一个或多个以root身份执行的文件/目录的权限,这些权限在以www-数据。

这是PHP安全性的一部分,你说你是从一个PHP脚本运行它,而不是你通过一个PHP脚本从Apache运行它。

PHP web脚本不应具有root用户访问权限,因此它们以与Apache用户www-data相同的权限运行。

有一些方法可以防止以root身份运行php,但是以root身份运行一个任务,但是这有点难以理解,我不打算分享这些代码,但是我会解释一下,所以你可以查看它。 这里是从哪里开始

http://php.net/manual/en/function.proc-open.php

有了像这样的Proccess,你可以执行一个proc。 就像你的script.js通过nodeJS使用SUDO,然后读取stdOut和stdErr等待密码请求,然后通过写入stdIn来提供该进程。

不要忘记在这样做的用户www-data必须有一个密码,并在sudoers列表