У меня есть сценарий nodejs
с именем script.js
.Запуск FOREVER или PM2 как WWW-DATA из скрипта PHP
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
все работает smootly:
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
Проблема заключается в том, когда я хочу, чтобы запустить сценарий из PHP
сценария с system
или exec
функции:
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
, я могу закрыть все форварды командой forever stopall
от root
. Когда я пробую то же самое, что работает 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 су www-data', а затем будет «навсегда остановить» его работу. – Creynders
, и если я делаю 'sudo -u www-data forever stopall', почему он не работает? – Damian
Да, хороший вопрос. Единственное объяснение, о котором я могу думать, это то, что навсегда порождает дочерние процессы, и при использовании 'sudo -u' только основной процесс пытается отключиться, поскольку этот пользователь и остальные процессы закрываются как« текущий »пользователь. – Creynders