Linux 在后台运行的命令行脚本处于停止状态
我有一个简短的php实用程序脚本,我只需使用以下命令从cli运行它:Linux 在后台运行的命令行脚本处于停止状态,linux,bash,scripting,shell,php,Linux,Bash,Scripting,Shell,Php,我有一个简短的php实用程序脚本,我只需使用以下命令从cli运行它: php myscript.php 脚本始终在运行,定期执行某些任务(与问题无关)。它不需要用户的任何输入。 运行它之后,我通常按CTRL+z,然后运行bg将进程置于后台,一切正常 如果我以以下方式运行它: php myscript.php & 脚本在启动时置于后台,但也处于停止状态。例如: [1] 11513 [1]+ Stopped php myscript.php 即使此时运
php myscript.php
脚本始终在运行,定期执行某些任务(与问题无关)。它不需要用户的任何输入。
运行它之后,我通常按CTRL+z,然后运行bg
将进程置于后台,一切正常
如果我以以下方式运行它:
php myscript.php &
脚本在启动时置于后台,但也处于停止状态。例如:
[1] 11513
[1]+ Stopped php myscript.php
即使此时运行bg
也无济于事,我必须运行fg
,然后再次按住CTRL+z键和bg
,以使其正常工作
这是php脚本:
<?
while(true){
echo 'hi '.time()."\n";
sleep(30);
}
?>
为什么php脚本在后台启动后被停止,而bash脚本没有停止?
什么会导致这种不同的行为?通常,您使用
&
发送到后台的过程以及等待终端输入的脚本会进入停止状态
例如,有一个bash脚本valecho
:
#!/bin/sh
read val
echo $val
将其运行为:
./valecho &
脚本将停止
什么时候运行它
echo hello | ./valecho &
将正确运行并完成
因此,检查您的php-可能需要从stdin
编辑-根据评论:
我不是一名php开发人员,只是尝试了下一个脚本(p.php
)
而且运行良好。。。所以sry为混乱…我找到了导致问题的原因。在PHP中,如果启用了readline模块,则任何命令行脚本都将需要输入,即使脚本编写为不等待用户输入 要检查是否启用了readline支持,只需运行:
php --info |grep "Readline Support"
并检查输出。如果启用了Readline Support=>则启用了Readline,您可能会遇到原始问题中描述的问题
使用cli的正确方法是显式指定php不使用终端进行输入:
php myscript.php < /dev/null &
php myscript.php < /dev/null &
或者(更有创意):
(注:我仍然相信这个问题属于ServerFault,顺便说一句,问题解决了!)来自:
启用readline时,php会将终端模式切换为接受行缓冲输入。这意味着,当您通过管道发送到交互式命令时,使用cli的正确方法是显式指定php未使用终端进行输入:
php myscript.php < /dev/null &
php myscript.php < /dev/null &
php myscript.php
如果能从投票首先结束问题的用户那里知道原因,那就太好了,这与专业的系统管理没有明显的联系。第二,你说你的脚本的任务“与问题无关”,但很明显它们是相关的,并且应该被描述。为什么它应该是明显的?如果我说它不相关,那就不相关了:脚本只包含了一个while(true)和sleep:)顺便说一句,我把它添加到了我的问题中,因此它可以帮助理解它有多(不)相关。就问题而言,与它将执行的任务无关。它直接与专业的系统管理连接,因为我在我的一台linux服务器中使用了这个脚本(为了备份,添加一些细节)。谢谢,但我认为不会是这样,因为脚本不等待任何用户输入。你可以在我的问题中看到代码,它很短。另外,如果我把它放在前台,然后放在后台,而不插入任何输入,它就会工作。。这怎么可能?@LorenzoMarcon请看编辑-对我有用。。。(只有默认的php安装)再次感谢您,问题是在我的pc上它对我也有效,但在服务器上它不起作用。。我正在调查这件事differences@LorenzoMarcon-仅提示:设置时间限制(0)代码>?我找到了导致问题的原因,并写下了答案。既然你给了我正确的输入(readline),我会给你一个被接受的答案:)谢谢!我也有同样的问题。我的PHP来自yum,未编译;如何禁用readline
?您是否尝试删除php readline包(如果已安装)?php myscript.php
为我解决了这个问题,感谢readline的解释
./test.php >/dev/null &
nohup php test.php > /dev/null 2>&1 &
php myscript.php < /dev/null &