我有这个简单的示例脚本:
#!/usr/bin/php
<?php
while(true) {
error_log("hello " . time() . "\n", 3, "logs.log");
sleep(3);
}
我使用命令执行:
me:~/Desktop$ php worker.php &
正如预期的那样,它会返回6683
:进程的ID。精细。
现在为了确保一切正常我做ps
并获得:
PID TTY TIME CMD
5561 pts/1 00:00:00 bash
6683 pts/1 00:00:00 php
6705 pts/1 00:00:00 ps
[1]+ Stopped php worker.php
为什么停止了?它是不是应该连续运行直到某人kill -9
呢?
如果我再做一次ps
,我会得到:
PID TTY TIME CMD
5561 pts/1 00:00:00 bash
6683 pts/1 00:00:00 php
7395 pts/1 00:00:00 ps
该过程在那里,但它没有记录(休眠?)
任何?
TA
答案 0 :(得分:1)
不确定我的推理是否正确,但我也遇到了这个问题,并使用nohup
解决了这个问题。
我的理由是这样的:
PHP进程具有stdin
的句柄。通过在后台运行进程,您无法从stdin
读取,也许在某些时候可能会发送挂断信号。
通过使用nohup,您可以忽略该信号。
答案 1 :(得分:1)
脚本必须有转储stdout的位置,否则它会显示上述行为(停止)。这可以这样做:
php worker.php > /dev/null &
像这样它可以工作,定时的infinte循环可以完成它的工作。唯一的问题是:如果你现在停止父进程(shell),那么后台php进程也会停止。
要绕过它,请运行:
disown -h php-process-id
Youi现在可以关闭所有炮弹,退出并前往酒吧。
干得好! ;)强>