假设我运行一个我怀疑包含无限循环的程序,或者一些可能运行时间过长的其他代码。我知道在 Linux 中我可以做到:
timeout 1 ./program
给程序一个 1 秒的超时时间。但是,如果我理解正确,这只会向程序发送一个“SIGTERM”信号——程序可能会忽略它。无论如何,有什么更安全的方法可以确保程序在 1 秒后停止?
我想到的一种解决方案是在 bash 和超时 bash 中运行程序,如下所示:
timeout 1 bash -c './program'
然后,1 秒后,bash 终止,因此它运行的程序也终止。这是一个好的解决方案吗?
这实际上取决于您所说的“安全”是什么意思。您有两种选择来终止进程:
kill -9
:)在大多数情况下,终止进程最干净和“最安全”的方法是用 SIGTERM 礼貌地询问它。这是因为默认情况下,程序会将 SIGTERM 传播给它们的所有子进程,从而清理整个进程树。这也更好,因为终止进程有时间干净地关闭他们正在做的事情(刷新缓冲区等)。
在您强行终止进程的情况下,这不一定(甚至默认情况下)会终止子进程。它有留下孤儿的倾向。它也有损坏文件的倾向,通常会造成一些混乱。
kill -9
因此,不应该自动使用 force kill ( ) 进行清理。Bash 脚本特别难以清理。默认情况下,它们会将 SIGTERM 传播到其子进程并等待其子进程终止。如果由于某种原因您将 SIGTERM 发送到 bash 脚本并且它没有终止,那么
kill -9
几乎肯定会留下孤儿。要强制杀死它们,您需要强制杀死脚本并强制杀死它的所有孩子。这通常很混乱,不建议作为自动操作。
幸运
timeout
的是,他意识到了子进程的问题,并在被要求时清除了整个进程树。将强制杀死所有子进程。请注意,这仍然是关闭命令的“肮脏”方式,因为它们没有机会正确清理自己并且可能损坏文件。
该命令的
-s
选项timeout
允许您指定要在超时时发送的信号。