【发布时间】:2016-01-31 19:19:05
【问题描述】:
我有一个名为 script.js 的 nodejs 脚本。
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 一样正常运行它,但现在我也想包含forever 或pm2 功能。当我是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
问题是当我想从带有system 或exec 函数的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
这是为什么呢?我该如何解决这个问题?
我还做了一些技巧,创建了一个用户“forever2”,我创建了一个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,我可以使用来自root 的命令forever stopall 关闭所有永远。当我尝试运行http://1.2.3.4/test.php 或www-data 用户的相同操作时,我无法从root 或www-data 关闭它,所以即使这样也行不通。
我从Ubuntu 14.04.3 LTS、Ubuntu 14.04 LTS、Debian GNU/Linux 8 尝试过……还是一样。
有什么想法吗?
谢谢。
【问题讨论】:
-
您无法“看到”永远以另一个用户身份运行的进程,即如果您先使用
sudo su www-data,然后再使用forever stopall,它会起作用。跨度> -
如果我这样做
sudo -u www-data forever stopall为什么它不起作用? -
是的,好问题。我能想到的唯一解释是永远产生子进程,当使用
sudo -u时,只有主进程被尝试关闭,因为该用户和其他进程作为“当前”用户被关闭。 -
相信我 ii 尝试使用
forever2运行,我必须补充一下,如果我以forever2登录,我可以在我是这个用户时创建和杀死永远,但这意味着script.sh计划应该可行,对吧? -
我想是的。但如果我理解正确,你不能用
www-data代替forever2来做.sh文件技巧?