Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 疯狂的权贵行为。不断生成已失效的bash进程_Php_Bash_Centos_Cron_Crontab - Fatal编程技术网

Php 疯狂的权贵行为。不断生成已失效的bash进程

Php 疯狂的权贵行为。不断生成已失效的bash进程,php,bash,centos,cron,crontab,Php,Bash,Centos,Cron,Crontab,我有一个crontab,看起来像: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 0-59 * * * * /var/www/html/private/fivemin/zdaemon.php >> /dev/null & 尽可能简单,对吗 我刚刚测试的zdaemon.php是: #!/usr/bin/php <? while(true){ sleep(1

我有一个crontab,看起来像:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

0-59 * * * * /var/www/html/private/fivemin/zdaemon.php >> /dev/null &
尽可能简单,对吗

我刚刚测试的zdaemon.php是:

#!/usr/bin/php
<?


while(true){
        sleep(1);
}

?>
#/usr/bin/php
无论何时运行,它都会像这样挂起:

root     15532  0.0  0.1 57228 1076 ?        Ss   19:09   0:00 crond
root     16681  0.0  0.1 72196 1428 ?        S    21:46   0:00 crond
root     16682  0.0  0.0     0    0 ?        Zs   21:46   0:00 [bash] <defunct>
root     16683  0.0  0.5 54800 5740 ?        S    21:46   0:00 /usr/bin/php /var/www/html/private/fivemin/zdaemon.php
root     16687  0.0  0.1 72196 1428 ?        S    21:47   0:00 crond
root     16688  0.0  0.0     0    0 ?        Zs   21:47   0:00 [bash] <defunct>
root     16689  0.0  0.5 54800 5740 ?        S    21:47   0:00 /usr/bin/php /var/www/html/private/fivemin/zdaemon.php
根15532 0.0 0.1 57228 1076?Ss 19:09 0:00克朗
根16681 0.0 0.1 72196 1428?S 21:46 0:00克朗
根166820.0.0?Zs 21:46 0:00[bash]
根16683 0.0 0.5 54800 5740?S 21:46 0:00/usr/bin/php/var/www/html/private/fivemin/zdaemon.php
根16687 0.0 0.1 72196 1428?S 21:47 0:00克朗
根166880.0.0?Zs 21:47 0:00[猛击]
根16689 0.0 0.5 54800 5740?S 21:47 0:00/usr/bin/php/var/www/html/private/fivemin/zdaemon.php
我整天都在为此绞尽脑汁。以前有人见过这个吗?有什么想法吗


这是对以下内容的引用:

我认为您的主要问题是,stderr仍将进入shell,但子进程(您的php进程)正在休眠,从而导致僵尸进程。试试这个:

0-59 * * * * /var/www/html/private/fivemin/zdaemon.php &> /dev/null &

如果您的僵尸进程仍然存在问题,请查看。

我认为您的主要问题是,stderr仍将进入shell,但子进程(您的php进程)正在休眠,从而导致僵尸进程。试试这个:

0-59 * * * * /var/www/html/private/fivemin/zdaemon.php &> /dev/null &

如果僵尸进程仍然存在问题,请查看。

创建守护进程的常用方法是派生子进程来完成工作,然后退出父进程,错误代码为0。不过,我不确定这是否是你的问题


我没有在php中完成这项工作,但您可以使用它来模拟。

创建守护进程的常用方法是派生一个子进程来完成这项工作,然后退出父进程,错误代码为0。不过,我不确定这是否是你的问题


我没有在php中完成这项工作,但您可以使用它进行模拟。

在crontab中为进程添加背景对我来说似乎很奇怪。尝试删除行末尾的
&

在crontab中设置进程的背景对我来说似乎很奇怪。尝试删除行末尾的
&

僵尸进程本身并不一定是坏事。它表示子进程已死亡,而父进程尚未获得其状态(使用
wait()
或相关的系统调用)

发生的情况如下-
cron
对它启动的脚本中的stderr感兴趣(这样它可以在脚本失败时通过电子邮件发送给您),因此它创建了一个管道,将脚本的stderr附加到write end(文件描述符2)。然后
cron
坐在管道的读取端进行读取,等待脚本退出并读取eof(
read()
,零字节)-然后重新获取脚本的返回状态

在您的示例中,守护进程生成并继承了stderr文件描述符,因此当中间shell退出(并失效)时,守护进程将保持管道打开。因此
cron
从不读取eof,因此从不获取返回状态

解决方案是确保关闭守护进程的stderr。这可以通过以下方式实现:

0-59 * * * * /var/www/html/private/fivemin/zdaemon.php >> /dev/null 2>&1 &
它将stdout和stderr写入
/dev/null
僵尸进程本身并不一定是坏事。它表示子进程已死亡,而父进程尚未获得其状态(使用
wait()
或相关的系统调用)

发生的情况如下-
cron
对它启动的脚本中的stderr感兴趣(这样它可以在脚本失败时通过电子邮件发送给您),因此它创建了一个管道,将脚本的stderr附加到write end(文件描述符2)。然后
cron
坐在管道的读取端进行读取,等待脚本退出并读取eof(
read()
,零字节)-然后重新获取脚本的返回状态

在您的示例中,守护进程生成并继承了stderr文件描述符,因此当中间shell退出(并失效)时,守护进程将保持管道打开。因此
cron
从不读取eof,因此从不获取返回状态

解决方案是确保关闭守护进程的stderr。这可以通过以下方式实现:

0-59 * * * * /var/www/html/private/fivemin/zdaemon.php >> /dev/null 2>&1 &

它将stdout和stderr写入
/dev/null

需要注意的是,使用fork()启动守护程序并不简单,通常需要两次fork才能正确执行。需要注意的是,使用fork()启动守护程序并不简单,通常需要两次fork才能正确执行。这非常完美!!是100%的标准把我搞砸了。我将行更改为:$LDIR/$EXEC&>$LDIR/swapi.log&MYPID=$!在我的init.d脚本中(请参阅其他帖子),现在一切正常。谢谢谢谢谢谢谢谢!!!这太完美了!!是100%的标准把我搞砸了。我将行更改为:$LDIR/$EXEC&>$LDIR/swapi.log&MYPID=$!在我的init.d脚本中(请参阅其他帖子),现在一切正常。谢谢谢谢谢谢谢谢!!!