Php 疯狂的权贵行为。不断生成已失效的bash进程
我有一个crontab,看起来像: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
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脚本中(请参阅其他帖子),现在一切正常。谢谢谢谢谢谢谢谢!!!