我有一个简短的php实用程序脚本,我只需使用:
从cli运行它php myscript.php
脚本始终在运行,定期执行某些任务(与问题无关)。它不需要用户的任何输入。
运行后,我通常按 CTRL + z ,然后运行bg
将进程置于后台,一切正常。
如果我按原样运行:
php myscript.php &
脚本在启动时放在后台,但它也处于停止状态。例如:
[1] 11513
[1]+ Stopped php myscript.php
即使在此时运行bg
也无济于事,我必须运行fg
,然后 CTRL + z 和{{1再次让它发挥作用。
这是php脚本:
bg
我的问题是我不能直接在后台运行它,因为系统会阻止它,我不明白为什么。我该如何解决这个问题?
更新
我制作了相同脚本的bash版本,只需将其与&amp ;,一起启动即可运行并放入后台(运行和未停止)最后(<?
while(true){
echo 'hi '.time()."\n";
sleep(30);
}
?>
)
script.sh:
script.sh &
为什么php脚本在后台启动后会被停止,而bash脚本却没有? 什么可能导致这种不同的行为?
答案 0 :(得分:18)
我找到了造成这个问题的原因。在PHP中,如果启用了readline模块,任何命令行脚本都会期望输入,即使脚本被写入NOT等待用户输入。
要检查是否启用了readline支持,只需运行:
php --info |grep "Readline Support"
并检查输出。如果您获得Readline Support => enabled
,那么您启用了readline,并且您可能会遇到原始问题中描述的问题。
然后使用cli的正确方法是明确指定php没有使用终端输入:
php myscript.php < /dev/null &
更多信息:http://php.net/manual/en/book.readline.php
备选方案:
./test.php >/dev/null &
或(更有创意):
nohup php test.php > /dev/null 2>&1 &
(p.s。:我仍然认为这个问题属于ServerFault,顺便说一下..问题解决了!)
答案 1 :(得分:0)
通常情况下,您使用&
向脚本发送的内容以及等待终端输入的脚本进入停止状态。
E.g。有一个bash脚本valecho
:
#!/bin/sh
read val
echo $val
将其命名为:
./valecho &
脚本将停止。
以
运行时echo hello | ./valecho &
将正确运行并完成。
所以,检查你的php - 可能需要stdin
修改 - 根据评论:
我不是php开发人员 - 但只是尝试了下一个脚本(p.php
)
<?php
while(true){
echo 'hi '.time()."\n";
sleep(3);
}
?>
使用命令:
php -f p.php &
并且运行得很好......所以......为了混乱而烦恼......
答案 2 :(得分:0)
来自http://php.net/manual/en/book.readline.php:
当启用readline时,php会切换终端模式以接受行缓冲输入。这意味着在管道交互式命令时使用cli的正确方法是明确指定php没有使用终端进行输入:
php myscript.php < /dev/null &