我正在尝试在unix环境中从php生成一个类似守护进程的进程,保持pid以供参考并使其完全独立于httpd进程。这对于从管理后台控制中间件应用程序非常有用。我希望将它概括为可以重用于任何命令,我不想为每个命令编写.sh。
使用php的exec()我正在运行此命令:
$command = "java /myApp/TestInfiniteLoop";
$log = "/myApp/myLog.txt";
$echos = null;
$fullCommand = "bash -c 'nohup $command < /dev/null > $log 2>&1 & echo $! & exit' & echo $!";
exec($fullCommand, $echos);
$pid = (int)$echos[0] + 2;
它返回$ pid但不会产生进程(或立即杀死它......)。
如果我在bash shell上运行$ fullCommand,它可以完美运行。我可以关闭bash,一切都按预期运行。
如果我取出“nohup”它可行(但是pid是+ 1而不是+2),但是一旦你停止httpd,这个过程就会被杀死......
使其正常工作的正确方法是什么?
如果有可能,任何人都可以纠正它直接获得pid?我假设它是来自bash(+2)调用的第二个进程,但它可能(虽然不太可能,我知道......)它不会是相同的。
PS:我一直在Mac和Linux环境中测试它。
答案 0 :(得分:1)
你几乎拥有它。我想你可能有太多的管道正在进行,http进程没有断开连接,因为它正在等待输出。这将有效:
$command = 'java /myApp/TestInfiniteLoop';
exec('nohup '.$command.' >> /myApp/myLog.txt 2>&1 & echo $!', $pid);
$pid = (int)$pid[0];
我一直使用PHP脚本执行此操作,您不必编写shell脚本。
答案 1 :(得分:0)
我过去做过的一件事就是有一个单独的进程(如python或c应用程序)已经运行,可以监视文本文件或数据库。 php进程要么写入文件或数据库,而另一个进程作为具有单独权限的单独用户运行,则轮询该文件或数据库。当它看到它正在寻找的东西时,它会做任何需要的事情,将进度报告回文件或数据库。这样你就可以在应用程序中有更多的自由和灵活性(例如,它可以将其pid写入文件,以便php知道它是什么)。
答案 2 :(得分:0)