好的,我需要编写一段调用脚本的代码,如果脚本中的操作挂起,则终止进程。
首选语言是Python,但我也查看了C和bash脚本文档。
似乎是一个简单的问题,但我无法决定最好的解决方案。
从目前的研究来看:
- Python:有一些奇怪的线程模型,虚拟机使用一次一个线程,不会工作吗?
- C:目前首选的解决方案似乎是使用SIGALARM + fork +execl。但是SIGALARM不是堆安全的,所以它可以丢弃所有东西? Bash:超时程序?不是所有发行版的标准?
由于我是Linux的新手,我可能不知道这些函数有500个不同的陷阱,所以谁能告诉我最安全、最干净的方法是什么?
避免使用SIGALRM
,因为在信号处理程序内部没有太多安全的事情可做。
考虑到您应该使用的系统调用,在C中,在执行fork-exec以启动子进程之后,您可以使用WNOHANG
选项定期调用waitpid(2)
以检查子进程是否仍在运行。
waitpid
返回0
(进程仍在运行)并且超时时间已过,则可以将子进程kill(2)
在bash中可以做类似的事情:
- 使用& 在后台启动脚本/程序
- 获取后台进程id
- 休眠一段时间
- ,然后杀死进程(如果它已经完成,你不能杀死它),或者你可以检查进程是否仍然活着,然后杀死它。
的例子:
sh long_time_script.sh &
pid=$!
sleep 30s
kill $pid
您甚至可以尝试使用trap 'script_stopped $pid' SIGCHLD
-查看bash man获取更多信息。
更新:我发现了其他命令超时。它完全可以满足您的需求——运行带有时间限制的命令。例子:
timeout 10s sleep 15s
将在10秒后杀死sleep
。
有一组Python代码具有完成此任务的特性,如果您了解api,则不会有太大困难。
Pycopia集合具有用于计时函数的scheduler模块,以及用于生成子进程并向其发送信号的proctools模块。在这种情况下可以使用kill
方法