如何比较方便的杀死 nohup 起的进程及其所有子进程?

2021-09-18 10:58:34 +08:00
 ffxung

主控程序是一个 shell 脚本(如main.sh),里面会启动一下子进程. 直接执行时, 可以用kill -- -PPID(主进程号前有个负号)的方式杀掉主进程和所有子进程, 但发现用 nohup 启动主进程的话, 用这种方式失效了, 提示 kill: (-7228) - No such process (7228 是main.sh的 pid). 求助, 如何比较方便的杀死 nohup 起的进程及其所有子进程? 网上查了不少资料,但没有找到特别方便的方式.

4308 次点击
所在节点    Linux
17 条回复
typetraits
2021-09-18 11:09:41 +08:00
main.sh 里保存一下 nohup 启动的程序的 pid,然后结束进程的时候 kill 这个 pid
ffxung
2021-09-18 11:11:46 +08:00
刚搜到一个, 发现 pkill -P pid(main.sh 的 pid)可以实现
ffxung
2021-09-18 11:15:13 +08:00
@typetraits 我 kill nohup 启动起来的`main .sh`的 pid, 发现只是`mian .sh`杀掉了, 子进程还在. 你说的是不是这个意思?
triangle111
2021-09-18 11:24:33 +08:00
我会写 restart 的 shell,在 nohup 之前找出所有关于启动命令的 pid 然后所有都 kill 掉
Rkls
2021-09-18 11:35:32 +08:00
用 c 实现下,用到 daemon,fork,execvp,waitpid,kill 几个函数,pid 在 daemon 之后存到文件里,kill 的时候读就行了
makelove
2021-09-18 11:49:27 +08:00
别 nohup 了,systemd-run 吧,完美解决你说的问题
cweijan
2021-09-18 12:33:54 +08:00
@triangle111 我之前也写过, 后来发现直接用 pkill 命令就行了.
ffxung
2021-09-18 13:14:56 +08:00
@cweijan 确实. 我用 pkill -P 主进程 pid 可以完美解决. 感谢!
ffxung
2021-09-18 13:15:30 +08:00
@makelove 还没用过这个命令, 我去学习一下,感谢
codehz
2021-09-18 13:24:16 +08:00
可以考虑开一个 pid 命名空间,然后杀掉 pid 为 1 的进程就可以解决
muzuiget
2021-09-18 17:07:05 +08:00
要维护进程状态,建议用 supervisord 把平安保。
msg7086
2021-09-18 18:51:11 +08:00
几乎是唯一靠谱的方法是走 cgroups 管理进程树。你 nohup 启动的程序开出来的进程也不保证就是在这个程序旗下的。只有 cgroups 可以追溯到所有的子进程。
所以用 systemd 来管理吧,多省事……
ysc3839
2021-09-18 19:07:43 +08:00
印象中 POSIX 下没有一个可靠的杀死所有子进程的方法,即子进程有办法脱离进程树,不被杀死。
Linux 下可以用前面提到的 pid namespace 或者 cgroups 。
Windows 下可以使用 Job object 实现。
ongongethan
2021-09-18 19:56:42 +08:00
kill -9 `lsof -ti:port`
ila
2021-09-18 20:24:17 +08:00
supervisor 或 pm2,专业事让专业工具干
yanqiyu
2021-09-20 16:37:22 +08:00
放弃 nohup,使用 systemd-run,可以更加有效的管理程序的生命周期和资源占用
julyclyde
2021-09-22 12:19:38 +08:00
@muzuiget supervisord 很容易漏进程出去的
systemd-run 是王道

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802716

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX