【问题标题】:How to trap and exit all child processes如何捕获和退出所有子进程
【发布时间】:2019-12-10 14:39:13
【问题描述】:

我试图让hollywood 以一种我可以用正常的 Ctrl+C 信号退出的方式运行。 目前,我必须多次按 Ctrl+C 才能卡在 hollywood 创建的 tmux 实例中。看source code,有一个trap命令:

trap "pkill -f -9 lib/hollywood/ >/dev/null 2>&1; exit 0" INT

但显然这还不够。我试过用几个不同的替换它,但没有一个能做对:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT

trap 'kill $(jobs -p)' EXIT

trap 'pkill -f -9 lib/hollywood/ >/dev/null 2>&1; kill -9 $(ps -eo pid,command | grep tmux | grep byobu | grep hollywood | sed -r "s/^[^0-9]*([0-9]+).*/\1/") >/dev/null 2>&1; exit 0' INT

trap "exit" INT TERM
trap "kill 0" EXIT

我已经尝试了这个问题的几个答案:How do I kill background processes / jobs when my shell script exits? 但这些都没有奏效。 (我还是要按 Ctrl+C 几次,然后手动退出 tmux 会话。)

有没有简单的方法来解决这个问题? (我宁愿不必过多地弄乱源代码。)

【问题讨论】:

    标签: bash child-process kill tmux bash-trap


    【解决方案1】:

    它们不是后台进程,它们在不同的 tmux 窗格中运行 - tmux 是父进程,而不是好莱坞脚本。所以你列出的大部分命令都没有任何效果。

    如果模式正确,pkill 应该可以工作。如果从 tmux 外部运行 pkill 是否有效?看起来每个好莱坞小部件都使用相同的 pkill 安装了自己的陷阱,因此如果有人被杀死,它应该将它们全部杀死。

    或者,如果您没有在自己的 tmux 服务器中运行它,您可以简单地让 C-c 杀死 tmux 窗口 - 更改 hollywood 在创建 tmux 会话时执行类似的操作(大约第 78 行):

    $tmux_launcher bind -n C-c kill-window
    

    如果您有一个不想杀死的现有 tmux,这会更难,因为您希望 C-c 用于其他目的。您可以将 C-c 绑定更改为:

    bind -n C-c if -F '#{==:#{window_name},hollywood}' 'kill-window' 'send C-c'
    

    但你可能不想这样做,除非你经常使用好莱坞。

    在 hollywood issue tracker 中询问这个问题可能比在这里 TBH 更有用。

    【讨论】:

    • 谢谢,第一个 C-c 绑定有效,但它会杀死所有 hollywood 实例......所以我尝试了第二个,但那个(不知道为什么)根本不起作用。我在$tmux_session new-session ... 行的正下方插入了$tmux_launcher bind ... 行,以防万一。 ...关于我的 pkill,是的,它在从另一个终端手动运行时确实有效。
    • 嗯,如果 pkill 在外面工作,那么陷阱应该工作,如果没有,我建议向开发人员报告。我不知道为什么 ^C 不起作用,您遇到了哪一个问题? if -F 一个?
    • 注意 pkill 当然会杀死所有 hollywood 实例。
    猜你喜欢
    • 2018-06-24
    • 2015-02-03
    • 2016-12-10
    • 1970-01-01
    • 2020-06-20
    • 2013-03-27
    • 2011-04-13
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多