我正在写一个应用程序。它能够产生各种外部进程。当应用程序关闭时,我希望它产生的任何进程都被杀死。
听起来很容易,对吧?查找我的 PID,并递归地遍历进程树,以自下而上的方式杀死所有可见的东西。
不同之处在于,这并不正常工作。在一种特定情况下,我 spawn foo
,但foo
只是spawn ,bar
然后立即退出,继续bar
运行。现在没有关于bar
曾经是应用程序进程树一部分的事实的记录。因此,应用程序无法知道它应该杀死bar
.
我很确定我不能成为地球上第一个尝试这样做的人。那么标准的解决方案是什么?我想我真的在寻找某种方式来“标记”一个进程,这样它产生的任何进程都将无条件地继承相同的标签。
(到目前为止,我能想到的最好的方法是以不同的用户身份运行应用程序。这样,您就可以随意终止属于该用户的所有进程。但这有各种访问权限问题......)
我正在尝试构建一个流程容器。容器会触发其他程序。例如 - 使用 '&' 启动运行后台任务的 bash 脚本。
我所追求的重要特性是:当我杀死容器时,它下面产生的所有东西都应该被杀死。不仅是直系子女,还有他们的后代。
当我开始这个项目时,我错误地认为当你杀死一个进程时,它的孩子也会自动被杀死。我曾向有同样错误想法的人寻求建议。虽然有可能捕捉到信号并将杀戮传递给儿童,但这不是我在这里要寻找的。
我相信我想要实现的目标,因为当你关闭一个 xterm 时,它里面运行的任何东西都会被杀死,除非它被 nohup'd。这包括孤立进程。这就是我想要重新创建的。
我有一个想法,我正在寻找的内容涉及 unix 会话。
如果有一种可靠的方法来识别进程的所有后代,那么能够向它们发送任意信号也会很有用。例如SIGUSR1。