在运行后台进程的bash脚本上调用shell_exec的PHP超时

在运行后台进程的bash脚本上调用shell_exec的PHP超时,php,linux,bash,shell,Php,Linux,Bash,Shell,我有一个bash脚本,其中有几行类似于以下内容 echo "Do something" /bin/sh -c 'echo $$>pidfile && exec "command"' & echo "Ran Command">/path/to/outputfile.txt exit 0 然后我从PHP脚本调用它 返回shell_exec(“/path/to/bash/script参数”) 现在,当我这样做时,命令成功运行,outputfile.txt包含“ra

我有一个bash脚本,其中有几行类似于以下内容

echo "Do something"
/bin/sh -c 'echo $$>pidfile && exec "command"' &
echo "Ran Command">/path/to/outputfile.txt
exit 0
然后我从PHP脚本调用它
返回shell_exec(“/path/to/bash/script参数”)

现在,当我这样做时,命令成功运行,outputfile.txt包含“rancommand”

但是,PHP脚本在10秒后超时bash脚本运行大约需要2-3秒

如果我把线路改成
返回shell_exec(“/path/to/bash/script arguments>/dev/null 2>&1”)

然后它执行,PHP脚本不会超时


我理解为什么重定向输出会让PHP继续执行,但我不明白为什么PHP一开始就超时需要我这么做。有人能给我一些帮助吗?

测试这两个版本,你会得到它:

test1.sh
/bin/sh-c'sleep 10'>/dev/null 2>&1&

test2.sh
/bin/sh-c“睡眠10”和

在命令行上使用php运行这两个命令,如

test1.php
测试这两个版本,您会得到:

test1.sh
/bin/sh-c'sleep 10'>/dev/null 2>&1&

test2.sh
/bin/sh-c“睡眠10”和

在命令行上使用php运行这两个命令,如

test1.php
bin/sh
应仅使用
2>&1&
安装的
&
,因为您正在将脚本移动到后台,但输出仍然通过bash脚本传输。也许PHP会等待vor stdin/stderr关闭。如果是这样的话,那么如果我手动运行
/path/to/bash/script参数
,是否应该出现相同的超时(或明显的挂起)?没有。只有通过php的shell_exec()运行时才会发生超时。
/dev/null 2>&1&
查看此处
相同的超时时间
可能您不会看到输出,但/bin/sh仍然可以运行。用
htop
ps-Af
@justonUndermillion检查一下,我使用的是
/dev/null
部分,我知道你的意思。有什么理由把它放在bash脚本而不是PHP脚本中吗?
bin/sh
应该只使用
2>&1&
instaed of
&
,因为您正在将脚本移到后台,但输出仍然通过管道输送到bash脚本中。也许PHP会等待vor stdin/stderr关闭。如果是这样的话,那么如果我手动运行
/path/to/bash/script参数
,是否应该出现相同的超时(或明显的挂起)?没有。只有通过php的shell_exec()运行时才会发生超时。
/dev/null 2>&1&
查看此处
相同的超时时间
可能您不会看到输出,但/bin/sh仍然可以运行。用
htop
ps-Af
@justonUndermillion检查一下,我使用的是
/dev/null
部分,我知道你的意思。有什么理由把它放在bash脚本而不是PHP脚本中吗?它确实有效,我将把它标记为解决方案(我将把
/dev/null 2>&1
部分放在bash脚本中),但我仍然有点不知所措。在PHP下运行它们的行为确实不同。然而,在bash中,
/test1.sh
/test2.sh
执行完全相同的操作,它确实有效,我将把它标记为解决方案(我将把
/dev/null 2>&1
部分放在bash脚本中),但我仍然有点不知所措。在PHP下运行它们的行为确实不同。但是,在bash中,
/test1.sh
/test2.sh
执行完全相同的操作,