好吧,这看起来真的很奇怪。当我从命令行运行 php 脚本并&
在末尾添加在后台运行它时,它会立即停止。我在另一台服务器上尝试过,它按预期工作;该作业正在后台运行。
PHP
#!/usr/bin/php
<?php
sleep (5);
服务器 1 上的输出
[mk@li89-44 html]# ./test.php &
[1] 4938
[mk@li89-44 html]# jobs
[1]+ Running ./test.php &
服务器 2 上的输出
[mk@dev html]# ./test.php &
[1] 4938
[mk@dev html]# jobs
[1]+ Stopped ./test.php &
在服务器 2 上,我可以像这样在后台获取它:
[mk@dev html]$ ./test.php
ctrl + z
[1]+ Stopped ./test.php
[mk@dev html]$ bg
[1]+ ./test.php &
[mk@dev html]$ jobs
[1]+ Running ./test.php
同样在服务器 2 上,如果我执行类似操作,wget "http://fileserver.com/largefile.gz" &
它会按预期进入 bg 运行。nohup ./test.php &
在服务器 2 上运行也按预期进行。
两台服务器都运行 centos,版本不同,php 版本也不同。我不知道这是否相关,或者是否可以顺便解释一下jobs
,fg
在bg
linux 上工作。
答案1
如果你查看strace
该过程,你会看到 PHP 始终初始化终端,这需要等待 PHP 控制终端:
ioctl(0, TCSETSW, {B38400 opost isig icanon echo ...}) = ? ERESTARTSYS
--- {si_signo=SIGTTOU, si_code=SI_KERNEL} (Stopped (tty output)) ---
--- Stopped (tty output) by SIGTTOU ---
一个简单的解决方法:
./test.php > /dev/null &
答案2
您确定已经安装了 php-cli 包吗?
检查是否/usr/bin/php
是二进制文件的路径,不同的分布使用不同的路径。