【问题标题】:How can I kill a process when I close the bash terminal?关闭 bash 终端时如何终止进程?
【发布时间】:2020-09-19 03:43:36
【问题描述】:

我找到了许多方法来在 bash 终端关闭后保持进程在后台运行。但是,我该怎么做相反的事情呢?终端关闭时如何终止后台进程?

目前,当我关闭终端时,我得到“进程正在会话中运行......仍然关闭?”如果我点击确定,终端会关闭,但进程不会被杀死并徘徊。我可以将这些进程的抑制与终端进程的“死亡”挂钩吗?

简单示例:运行ssh-agent bash,然后尝试关闭终端。

【问题讨论】:

    标签: bash terminal process kill-process


    【解决方案1】:

    把这个放在你的.bashrc:

    trap 'kill $(ps -o pid= --ppid $$) 2>/dev/null' exit
    

    这个命令会在你退出时让 shell 杀死它所有的子进程。


    说明:


    trap 命令捕获信号和其他事件,并让您执行命令,这些命令在捕获信号或事件发生时运行。

    trap [-lp] [[arg] signal_spec ...]
    

    ARG 是当 shell 接收到信号 SIGNAL_SPEC 时要读取和执行的命令。如果 SIGNAL_SPEC 为 EXIT,则在退出 shell 时执行 ARG。


    kill 命令向作为参数提供的 PID 的作业发送信号。

    kill [-s sigspec | -n signum | -sigspec] pid ...
    

    如果 SIGSPEC 和 SIGNUM 都不存在,则假定为 SIGTERM(终止信号)。


    ps 命令显示有关进程的信息。

    -o format
        User defined format of output.
    --ppid pidlist
        Select which processes to show by PID of their parent process. Selects processes
        that are children of those listed in PIDLIST.
    

    最后,shell 中的$$ 扩展为shell 的进程ID。在$(...) 子shell 中,它扩展为当前shell 的进程ID,而不是子shell。

    2>/dev/null 用于丢弃 kill 命令的潜在错误输出,这可能是由执行 kill 命令时不再存在但在执行 ps 命令时存在的进程引起的 - 通常是子 shell @ 987654332@.

    【讨论】:

    • 这对我不起作用。在使用ssh-agent bash 进行测试时,我尝试将此行添加到.bashrc,然后尝试将其添加到.profile,但是当我关闭终端时,ssh-agent 仍在运行。如果我从.profile 运行ssh-agent bash,这条线应该工作吗?或者这会改变什么吗?
    • 看起来ssh-agent 有时需要几秒钟才能停止其活动。当我打开新终端时,输入 ssh-agent bash 并关闭终端窗口,然后执行 pgrep -a ssh-agent,直到我看到 ssh-agent 命令在几秒钟后关闭。但是,在这种情况下,您甚至不需要陷阱,因为此 ssh-agent 命令在前台运行并在您关闭终端时退出。
    • 要在后台进程上尝试trap命令,您可以尝试ssh-agent sleep 1000 &,然后关闭终端。该进程随后被终止,再次需要几秒钟。
    • 最终设法使它与一些摆弄和ssh-agent -k 一起工作
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2018-11-26
    相关资源
    最近更新 更多