首页 > 解决方案 > 杀死终端后是否可以执行bashscript?

问题描述

我知道当您打开终端时有一个名为.bash_profile执行代码(bashscript)的文件。

当您退出终端时,还会调用另一个文件来.bash_logout执行代码。

当终端被杀死时我将如何执行一些脚本?

.bash_logout当终端被杀死时不要覆盖这个)。

标签: bashshellterminalshkill-process

解决方案


当终端被杀死时我将如何执行一些脚本?

我将此解释为“在终端窗口关闭时执行脚本”。为此,请在.bashrcor中添加以下内容.bash_profile

trap '[ -t 0 ] || command to execute' EXIT

当然,您可以将所有命令替换command to executesource ~/.bash_exit并将所有命令放入.bash_exit主目录中的文件中。

每当 shell 退出时,都会执行特殊的 EXIT 陷阱(例如,通过关闭终端,也可以通过按CtrlD提示,或正在执行exit,或...)。

[ -t 0 ]检查标准输入是否连接到终端。由于||只有在测试失败时才会执行下一个命令,这在关闭终端时会执行,但对于退出 bash 的其他常见方式(例如按下CtrlD提示符或正在执行exit)则不会执行。

失败的尝试(仅当您尝试查找和替代时才阅读)

在我听说过的终端中,当窗口关闭时,bash 总是会收到一个 SIGHUP 信号。有时甚至有两个 SIGHUP;一个来自终端,一个来自内核,当 pty(伪终端)关闭时。但是,有时两个 SIGHUP 在交互式会话中都会丢失,因为 bash 的readline 暂时使用自己的 traps。奇怪的是,当存在 EXIT 陷阱时,SIGHUP 似乎总是被捕获。即使那个 EXIT 陷阱什么也没做。

但是,我强烈建议不要在 SIGHUP 上设置任何陷阱。Bash 仅在当前命令完成后才处理非 EXIT 陷阱。如果您运行sh -c 'while true; do true; done'并关闭终端,bash 将继续在后台运行,就好像您使用了disownor一样nohup


推荐阅读