为了账号安全,请及时绑定邮箱和手机立即绑定

杀死子进程 - 执行。命令

杀死子进程 - 执行。命令

Go
慕标5832272 2022-08-15 17:38:57
如何杀死子进程?我有一个长时间运行的应用程序,使用“exec.命令“:// ...I am a long running application in the background// Now I am starting a child process, that should be killed togeter with the parent application.cmd := exec.Command("sh", "-c", execThis)// create a new process group// cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}现在,如果我杀死它就不会杀死子进程 - 你知道怎么做吗?<pid of long running application in the background>
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

这里有很多事情需要梳理。

首先,这是操作系统本身的作用。然后,一旦我们知道操作系统是什么以及它做了什么,程序就会做什么。

显然,操作系统的作用取决于操作系统。POSIX风格的操作系统有两种:普通和基于进程组的,或killpg。这个函数的 killpg 变体是唯一一个向整个进程组发送信号的函数;plain 只是向单个进程发送信号。killkillkillkill

当程序从控制终端运行时,键盘信号(^C,^Z等)被发送到该控制终端的前台进程组(请参阅链接的页面以获取对这些信号的合理描述,并注意BSD / macOS也有^T和)。但是,如果信号是从其他程序发送的,而不是从控制终端发送的,则由该程序决定是否调用或 ,以及发送什么信号。SIGINFOkillpgkill

某些信号无法捕获。SIGKILL和SIGSTOP就是这种情况。这些信号不应该随意发送;它们应该保留给最后的手段。相反,希望另一个程序停止的程序通常应该发送SIGINT,SIGTERM,SIGHUP或(很少)SIGQUIT中的一个。Go倾向于将SIGQUIT绑定到调试(因为POSIX系统上的运行时使^\转储各种goroutines的堆栈),因此这不是一个好的选择。但是,这不是由您在此处编写的Go程序决定的,该程序只能尝试捕获信号。发送内容的选择取决于发件人。

捕捉信号的“Go方式”是使用goroutine和通道。信号。通知功能将操作系统级信号转换为通道上的事件。您不知道(也无法)知道的是信号是否通过或到达您的过程(尽管如果它来自控制终端交互,POSIX-y内核通过等效项发送)。如果要自行传播该信号,只需使用通知事件调用进行操作系统级调用的代码即可。使用 os/exec 包时,请使用 cmd.Process.Signal:请注意,这会调用 POSIX ,而不是它的 ,但您不希望在此处使用,因为我们首先假设的是非进程组信号(基于 p 组的信号可能不需要传播)。killkillpgkillpgkillkillkillpgkillpg

没有完全可移植的方式将信号发送到POSIX进程组(这并不奇怪,因为这不是可移植到非POSIX系统)。可悲的是,在Go中似乎没有直接的Unix或POSIX特定方法来做到这一点。

在非POSIX系统上,一切都完全不同。请参阅操作系统/信号前面的讨论。


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信