【问题标题】:Why does my process stop when run in background?为什么我的进程在后台运行时会停止?
【发布时间】:2015-01-03 06:08:37
【问题描述】:

我正在使用 php5.3.3 在 CentOS 6.5 上运行一个简单的 PHP 脚本

#!/usr/bin/env php
<?php
    echo "hello"."\n";
    return 0;
?>

我的问题是,如果我执行./testscript,它运行良好,如果我执行nohup ./testscript &amp;,它运行良好,如果我执行./testscript &lt; /dev/null &gt; /dev/null &amp;,它运行良好(没有输出重定向也是如此)。 但是如果我这样做./testscript &amp;,脚本就会停止(并且没有输出):

[1]+  Stopped                 ./testscript 

据我了解,这是因为 php 期望来自 STDIN 的一些输入。但问题是为什么?如您所见,在这个简单的脚本中没有什么需要输入的内容,而且我在 Debian 上的 php5.4 上也没有这种行为。这种行为变化是否来自 php 版本或操作系统? 为什么会这样?有没有办法改变它并允许我在后台运行脚本而不必添加 /dev/null 作为 STDIN ?

谢谢!

【问题讨论】:

  • 试试./testscript &gt; output.log 2&gt;&amp;1 &amp;。它应该停止,但至少你可以在它崩溃之前看到它的输出。
  • @hellcode:-1。这就是必须构造 shell 脚本的方式。没有shebang,没有./foo.php-type 调用。
  • @Mr.Llama: output.log 这样是空的。并且脚本由于 STDIN 停止..
  • 相关(CLI 版本构建时包含 readline):stackoverflow.com/questions/8194755/…

标签: php bash stdin centos6.5


【解决方案1】:

您的程序除了打印某些内容并以return 0 终止之外什么都不做(确定您不是指exit()?)。代码执行后,php 解释器不再做任何事情,只是向 shell 发出信号“嘿,伙计!我完成了!你可以通知用户了!”用&amp; 调用它只是告诉shell:“在后台运行这个命令。”它确实如此。正好一次。

为了让你的程序无限期运行,它也必须真正无限期地运行。

<?php
  while(true) {
    // Doing something useful
    sleep(5);
  }
?>

使用 nohup,“程序”(在这种情况下是 php 解释器)基本上被禁止终止 - 但它不再做太多了。至于重定向 - 它们实际上将针对 php 解释器,它将等待进一步的输入,因为 /dev/null 不会发出任何东西。

【讨论】:

  • 他没有表示他希望他的脚本永远运行。 nohup 不会阻止(或禁止)程序退出,它会阻止它因为挂断信号而被杀死。他的问题是为什么 php 等待输入。他没有要求它这样做。
  • 实际上,还有什么原因导致输入/输出重定向?也许我只是不明白这个问题。
  • 他指出了他运行程序的各种方式,以使其正常工作。为了说明解决他遇到的问题的各种事情......即他的脚本似乎正在等待标准输入,他不知道为什么。
  • @Markus W Mahlberg:正如 Etan 所说,我不希望脚本永远运行。而且我可以使用 return 或 exit 或什么都不使用,我的问题是相同的:php 脚本在执行任何操作之前停止(它不会回显我的问候)。当我说“停止”时,我的意思是脚本处于“停止”状态(T in ps aux),有点像暂停。
  • 我解释过 - 当为 php 打开一个标准输入时,它会在原始脚本运行后等待更多的事情发生。试试php &lt;&lt; EOF...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2023-01-13
相关资源
最近更新 更多