V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ffxung
V2EX  ›  Linux

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

  •  
  •   ffxung · 78 天前 · 2641 次点击
    这是一个创建于 78 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    17 条回复    2021-09-22 12:19:38 +08:00
    typetraits
        1
    typetraits  
       78 天前
    main.sh 里保存一下 nohup 启动的程序的 pid,然后结束进程的时候 kill 这个 pid
    ffxung
        2
    ffxung  
    OP
       78 天前
    刚搜到一个, 发现 pkill -P pid(main.sh 的 pid)可以实现
    ffxung
        3
    ffxung  
    OP
       78 天前
    @typetraits 我 kill nohup 启动起来的`main .sh`的 pid, 发现只是`mian .sh`杀掉了, 子进程还在. 你说的是不是这个意思?
    triangle111
        4
    triangle111  
       78 天前
    我会写 restart 的 shell,在 nohup 之前找出所有关于启动命令的 pid 然后所有都 kill 掉
    Rkls
        5
    Rkls  
       78 天前
    用 c 实现下,用到 daemon,fork,execvp,waitpid,kill 几个函数,pid 在 daemon 之后存到文件里,kill 的时候读就行了
    makelove
        6
    makelove  
       78 天前
    别 nohup 了,systemd-run 吧,完美解决你说的问题
    cweijan
        7
    cweijan  
       78 天前
    @triangle111 我之前也写过, 后来发现直接用 pkill 命令就行了.
    ffxung
        8
    ffxung  
    OP
       78 天前
    @cweijan 确实. 我用 pkill -P 主进程 pid 可以完美解决. 感谢!
    ffxung
        9
    ffxung  
    OP
       78 天前
    @makelove 还没用过这个命令, 我去学习一下,感谢
    codehz
        10
    codehz  
       78 天前 via Android   ❤️ 2
    可以考虑开一个 pid 命名空间,然后杀掉 pid 为 1 的进程就可以解决
    muzuiget
        11
    muzuiget  
       78 天前
    要维护进程状态,建议用 supervisord 把平安保。
    msg7086
        12
    msg7086  
       78 天前   ❤️ 1
    几乎是唯一靠谱的方法是走 cgroups 管理进程树。你 nohup 启动的程序开出来的进程也不保证就是在这个程序旗下的。只有 cgroups 可以追溯到所有的子进程。
    所以用 systemd 来管理吧,多省事……
    ysc3839
        13
    ysc3839  
       78 天前 via Android
    印象中 POSIX 下没有一个可靠的杀死所有子进程的方法,即子进程有办法脱离进程树,不被杀死。
    Linux 下可以用前面提到的 pid namespace 或者 cgroups 。
    Windows 下可以使用 Job object 实现。
    ongongethan
        14
    ongongethan  
       78 天前 via iPhone
    kill -9 `lsof -ti:port`
    ila
        15
    ila  
       78 天前 via Android
    supervisor 或 pm2,专业事让专业工具干
    yanqiyu
        16
    yanqiyu  
       76 天前
    放弃 nohup,使用 systemd-run,可以更加有效的管理程序的生命周期和资源占用
    julyclyde
        17
    julyclyde  
       74 天前
    @muzuiget supervisord 很容易漏进程出去的
    systemd-run 是王道
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2229 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 15:10 · PVG 23:10 · LAX 07:10 · JFK 10:10
    ♥ Do have faith in what you're doing.