Linux,子进程超时



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

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

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

从目前的研究来看:

  • Python:有一些奇怪的线程模型,虚拟机使用一次一个线程,不会工作吗?
  • C:目前首选的解决方案似乎是使用SIGALARM + fork +execl。但是SIGALARM不是堆安全的,所以它可以丢弃所有东西?
  • Bash:超时程序?不是所有发行版的标准?

由于我是Linux的新手,我可能不知道这些函数有500个不同的陷阱,所以谁能告诉我最安全、最干净的方法是什么?

避免使用SIGALRM,因为在信号处理程序内部没有太多安全的事情可做。

考虑到您应该使用的系统调用,在C中,在执行fork-exec以启动子进程之后,您可以使用WNOHANG选项定期调用waitpid(2)以检查子进程是否仍在运行。

如果waitpid返回0(进程仍在运行)并且超时时间已过,则可以将子进程kill(2)

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

  1. 使用&
  2. 在后台启动脚本/程序
  3. 获取后台进程id
  4. 休眠一段时间
  5. ,然后杀死进程(如果它已经完成,你不能杀死它),或者你可以检查进程是否仍然活着,然后杀死它。

的例子:

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

相关内容

  • 没有找到相关文章

最新更新