Linux 后台 PHP 进程

Linux 后台 PHP 进程

好吧,这看起来真的很奇怪。当我从命令行运行 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 版本也不同。我不知道这是否相关,或者是否可以顺便解释一下jobsfgbglinux 上工作。

答案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是二进制文件的路径,不同的分布使用不同的路径。

相关内容