在后台运行的命令行脚本进入停止状态

时间:2013-07-28 17:23:29

标签: linux bash scripting shell php

我有一个简短的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脚本却没有? 什么可能导致这种不同的行为?

3 个答案:

答案 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 &

source