好的,我需要编写一个调用脚本的代码,如果脚本中的操作挂起,则终止该过程。
首选语言是Python,但我也在查看C和bash脚本文档。
似乎是一个简单的问题,但我无法决定最佳解决方案。
到目前为止的研究:
由于我是Linux的新手,我可能没有意识到这些功能有500种不同的问题,所以有谁能告诉我最安全和最干净的方法是什么?
答案 0 :(得分:4)
避免使用SIGALRM
,因为在信号处理程序中没有太多安全的东西可以做。
考虑到您应该使用的系统调用,在C中,在执行fork-exec以启动子进程之后,您可以使用WNOHANG
选项定期调用waitpid(2)
来检查子进程是否仍然存在运行。如果waitpid
返回0
(进程仍在运行)并且已经过了所需的超时,则可以kill(2)
子进程。
答案 1 :(得分:2)
在bash中你可以做类似的事情:
示例:
sh long_time_script.sh &
pid=$!
sleep 30s
kill $pid
你甚至可以尝试使用trap 'script_stopped $pid' SIGCHLD
- 请参阅bash man获取更多信息。
更新:我找到了其他命令timeout。它完全符合您的需要 - 运行带有时间限制的命令。例如:
timeout 10s sleep 15s
将在10秒后终止sleep
。
答案 2 :(得分:1)
有一组Python代码具有完全相同的功能,如果您了解API,则没有太多困难。
Pycopia集合具有用于超时功能的调度程序模块,以及用于生成子进程并向其发送信号的proctools模块。在这种情况下可以使用kill
方法。