限制PHP中shell_脚本的执行时间
我使用PHP脚本在Linux中调用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秒
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的所有子进程。有道理?