脚本有效!
首先,我在 CLI 中输入以下内容:php worker.php >>/home/xxx/log 2>&1
然后,我希望它作为自己的进程或其他任何进程运行,因此我&
在末尾添加了一个,如下所示:php worker.php >>/home/xxx/log 2>&1 &
但是现在脚本从未执行过,因为没有附加任何内容/home/xxx/log
,而且当我检查时ps -fux
脚本仍然在那里。
我不明白的一件事是,当我运行最后一个命令时,我得到了这个:
xxx@xxx:/path$ php worker.php >>/home/xxx/log 2>&1 &
[1] 10659
稍后当我尝试退出 shell 时,它告诉我以下信息:
xxx@xxx:/path$ logout
There are stopped jobs.
[1]+ Stopped php worker.php >> /home/xxx/log 2>&1
这是怎么回事?我想要的只是在后台运行一个脚本并将所有输出附加到一个文件中。
谢谢!
编辑:
这是一个例子。
user@box:~/nohuptest$ vim worker.php
user@box:~/nohuptest$ touch log
user@box:~/nohuptest$ php worker.php >> log 2>&1 &
[1] 31523
user@box:~/nohuptest$ cat log
[1]+ Stopped php worker.php >> log 2>&1
user@box:~/nohuptest$ php worker.php >> log 2>&1 &
[2] 31626
user@box:~/nohuptest$ cat log
[2]+ Stopped php worker.php >> log 2>&1
user@box:~/nohuptest$
user@box:~/nohuptest$ cat worker.php
<?php
echo "hello world\n";
?>
user@box:~/nohuptest$
答案1
我认为一定是哪里出了错。你所描述的应该可以完美运行:
$ cat worker.php
<?
echo "hello world\n"
?>
$ php worker.php >> log 2>&1 &
[1] 16353
$ cat log
hello world
$ php worker.php >> log 2>&1 &
$ cat log
hello world
hello world
您能否尝试这个例子并让我们知道它是否有效?
只是[1] 16353
告诉bash
你它已经在后台启动了这项工作进程 ID共 16353 个。
答案2
我猜是你的程序打开了 tty。这可能不是你做的,而是 PHP 本身做的。
尝试:
php worker.php </dev/null >>/home/xxx/log 2>&1 &
如果这不起作用,您可以随时在 tmux/screen 中运行它:
tmux [enter]
php worker.php </dev/null >>/home/xxx/log 2>&1
[CTRL-b][d]
您可能还可以使用脚本运行它:
echo "php worker.php >>/home/xxx/log 2>&1" | script &
答案3
我找到了解决方案。
php script.php [args] </dev/null >>/path/to/log 2>&1 &
PHP 正在等待输入...我不知道是否可以在 php.ini 文件中修复此问题,但现在可以了...