Linux,在子进程上超时

时间:2011-08-30 13:42:46

标签: linux process timeout

好的,我需要编写一个调用脚本的代码,如果脚本中的操作挂起,则终止该过程。

首选语言是Python,但我也在查看C和bash脚本文档。

似乎是一个简单的问题,但我无法决定最佳解决方案。

到目前为止的研究:

  • Python:有一些虚拟机使用的奇怪的线程模型 一次一个线程,不起作用?
  • C:到目前为止,首选的解决方案似乎是使用SIGALARM + fork + EXECL。但SIGALARM不是堆安全的,所以它可以废弃一切吗?
  • Bash:超时计划?所有发行版都不标准?

由于我是Linux的新手,我可能没有意识到这些功能有500种不同的问题,所以有谁能告诉我最安全和最干净的方法是什么?

3 个答案:

答案 0 :(得分:4)

避免使用SIGALRM,因为在信号处理程序中没有太多安全的东西可以做。

考虑到您应该使用的系统调用,在C中,在执行fork-exec以启动子进程之后,您可以使用WNOHANG选项定期调用waitpid(2)来检查子进程是否仍然存在运行。如果waitpid返回0(进程仍在运行)并且已经过了所需的超时,则可以kill(2)子进程。

答案 1 :(得分:2)

在bash中你可以做类似的事情:

  1. 使用&
  2. 在后台启动脚本/程序
  3. 获取后台进程的进程ID
  4. 睡了一段时间
  5. 然后杀死进程(如果它已经完成你无法杀死它)或者你可以检查进程是否仍然存在然后杀死它。
  6. 示例:

    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方法。