Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从php启动独立进程(通过httpd)_Php_Linux_Bash_Unix_Daemon - Fatal编程技术网

从php启动独立进程(通过httpd)

从php启动独立进程(通过httpd),php,linux,bash,unix,daemon,Php,Linux,Bash,Unix,Daemon,我试图在unix环境中从php生成一个类似守护进程的进程,保留pid作为参考,并使其完全独立于httpd进程。这对于从管理后台控制中间件应用程序非常有用。我想让它通用化,以便对任何命令重用,我不想为每个命令都编写一个.sh 我使用php的exec()运行以下命令: $command = "java /myApp/TestInfiniteLoop"; $log = "/myApp/myLog.txt"; $echos = null; $fullCommand = "bash -c 'nohup $

我试图在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;
$command=“java/myApp/TestInfiniteLoop”;
$log=“/myApp/myLog.txt”;
$echos=null;
$fullCommand=“bash-c”nohup$命令$log 2>&1&echo$!&exit'&echo$!”;
exec($fullCommand,$echos);
$pid=(int)$echos[0]+2;
它返回$pid,但不生成进程(或立即终止进程…)

如果我在bashshell上运行$fullCommand,它将非常有效。我可以关闭聚会,一切都按预期进行

如果我去掉“nohup”,它会工作(但是pid是+1而不是+2),但是一旦停止httpd,进程也会被杀死

  • 正确的方法是什么

  • 如果可能的话,是否有人可以更正它以直接获取pid?我假设这是来自bash(+2)调用的第二个进程,但有可能(尽管不太可能,我知道…)会不一样


  • PS:我一直在Mac和Linux环境中测试它。

    我过去做过的一件事是有一个单独的进程(如python或c应用程序)已经在运行,它可以监视文本文件或数据库。php进程要么写入文件或数据库,而另一个进程(作为具有单独权限的单独用户运行)正在轮询该文件或数据库。当它看到它在寻找什么时,它会做任何它需要做的事情,将进度报告回文件或数据库。这样,你在应用程序的操作上就有了更多的自由和灵活性(例如,它可以将其pid写入文件,以便php知道它是什么)。

    我将研究类似的东西,它旨在创建长时间运行的进程(然后从中派生操作)而不是自己尝试生成应用程序,并尝试找出pid(它的另一个好处是更具跨平台性)。+2 pid肯定会出现竞速条件问题。

    您几乎就遇到了。我认为您可能有太多的管道在运行,http进程没有断开连接,因为它正在等待输出。这将有助于:

    $command = 'java /myApp/TestInfiniteLoop';
    exec('nohup '.$command.' >> /myApp/myLog.txt 2>&1 & echo $!', $pid);
    $pid = (int)$pid[0];
    

    我一直在用PHP脚本来做这件事,你不必编写shell脚本。

    假设pid为+2是不安全的。是的,这是问题的第二部分:)这看起来很复杂,而且我想做的事情充满了漏洞。。。我试图在库中实现它以供一般使用:/对于特定用途,我只需要使用init.dOK,现在我得到“nohup:cannotdetachfromconsole:unjustioctl for device”在log.txt中-是否缺少