Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制PHP中shell_脚本的执行时间_Php_Linux_Shell_Shell Exec - Fatal编程技术网

限制PHP中shell_脚本的执行时间

限制PHP中shell_脚本的执行时间,php,linux,shell,shell-exec,Php,Linux,Shell,Shell Exec,我使用PHP脚本在Linux中调用shell脚本,我执行以下操作: shell_exec('./shell_script.sh'); 在此之后,PHP脚本将继续。。所有这些都如预期的那样起作用 但是,有时shell_脚本由于任何原因都无法完成执行,因此问题是: 在执行x个时间量后,如何终止shell_script.sh? 这应该在PHP中以某种方式处理(不要认为这在本例中是可能的),还是应该在.sh中处理 因此,就在会议结束后: #!/bin/bash 在.sh的开头,如果执行时间超过20秒

我使用PHP脚本在Linux中调用shell脚本,我执行以下操作:

shell_exec('./shell_script.sh');
在此之后,PHP脚本将继续。。所有这些都如预期的那样起作用

但是,有时shell_脚本由于任何原因都无法完成执行,因此问题是:

在执行x个时间量后,如何终止shell_script.sh? 这应该在PHP中以某种方式处理(不要认为这在本例中是可能的),还是应该在.sh中处理

因此,就在会议结束后:

#!/bin/bash

在.sh的开头,如果执行时间超过20秒,我是否可以让它终止?

我不知道您是否可以在php中执行,在bash中可能存在更好的解决方案,但您可以这样做:

这是您可以立即放在
#后面的一行/bin/bash
要在20秒后终止当前脚本:

(sleep 20 && kill $$) &

bash将$$替换为当前脚本的pid。

我不知道您是否可以在php中执行此操作,bash中可能存在更好的解决方案,但您可以这样做:

这是您可以立即放在
#后面的一行/bin/bash
要在20秒后终止当前脚本:

(sleep 20 && kill $$) &

bash将$$替换为当前脚本的pid。

您可以使用如下内容:

# start timer
( sleep $TIMEOUT ; kill $$ ) 2>/dev/null &
TIMER_PID=$!

# "payload"
echo hello

# cancel timer
kill $TIMER_PID

YMMV不过,在我的测试中,应该取消计时器的部分有时不会停止睡眠,程序会一直等到超时结束。

您可以使用以下方法:

# start timer
( sleep $TIMEOUT ; kill $$ ) 2>/dev/null &
TIMER_PID=$!

# "payload"
echo hello

# cancel timer
kill $TIMER_PID

但是,在我的测试中,应该取消计时器的部分有时不会终止
睡眠
,程序会等待超时结束。

要使它在同一脚本中工作,可以启动一个子shell:
(sleep 20&&kill$$)&
是的,可以。我以为我已经试过了,但显然我没有,因为现在它工作了。。。我将编辑我的回答,因为它不能得到正确的pid,所以它似乎不能完全工作?e、 g.第3行:kill:(32613)-没有这样的过程。这种方法的问题是,脚本现在总是需要20秒才能结束,而不是说如果先完成脚本,则在8秒后结束。。。。hmmmm.@hsmoore.com当父进程在
sleep
完成之前退出时,“没有这样的进程”就会发生。您可以通过将子shell的stderr重定向到
/dev/null
来删除该消息。为了使脚本更快地消失,您可以通过存储PID并稍后终止它来取消计时器。事实上,我将添加一个带有代码示例的答案…为了使它在相同的脚本中工作,您可以启动一个子shell:
(sleep 20&&kill$$)&
是的,这很有效。我以为我已经试过了,但显然我没有,因为现在它工作了。。。我将编辑我的回答,因为它不能得到正确的pid,所以它似乎不能完全工作?e、 g.第3行:kill:(32613)-没有这样的过程。这种方法的问题是,脚本现在总是需要20秒才能结束,而不是说如果先完成脚本,则在8秒后结束。。。。hmmmm.@hsmoore.com当父进程在
sleep
完成之前退出时,“没有这样的进程”就会发生。您可以通过将子shell的stderr重定向到
/dev/null
来删除该消息。为了使脚本更快地消失,您可以通过存储PID并稍后终止它来取消计时器。事实上,我将添加一个带有代码示例的答案……我尝试过这种方法,但效果不太好,因为它不会杀死子进程,只杀死主shell_脚本。shell_脚本基本上使用xvfb run来运行x应用程序。因此,kill$TIMER_PID本质上也应该杀死bash的所有子进程。有意义吗?我尝试过这种方法,但效果不太好,因为它不会杀死子进程,只杀死主shell_脚本。shell_脚本基本上使用xvfb run来运行x应用程序。因此,kill$TIMER_PID本质上也应该杀死bash的所有子进程。有道理?