Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在后台运行的命令行脚本处于停止状态_Linux_Bash_Scripting_Shell_Php - Fatal编程技术网

Linux 在后台运行的命令行脚本处于停止状态

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实用程序脚本,我只需使用以下命令从cli运行它:

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 &