【问题标题】:Is it possible to execute a bashscript after kill a terminal?杀死终端后是否可以执行 bash 脚本?
【发布时间】:2021-10-01 05:47:09
【问题描述】:

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

还有一个名为.bash_logout 的文件在您退出终端时执行代码。

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

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

【问题讨论】:

  • 你可以查看trap命令。另外我认为最好将此问题发布到serverfault.com 以找到更好的答案...
  • “终端被杀死”是什么意思? .bash_profile.bash_logout 都与终端无关:它们分别在登录 shell 启动和退出时执行。涉及终端的唯一方法是启动和停止 shell。
  • @chepner,例如终端被 vscode 杀死。

标签: bash shell terminal sh kill-process


【解决方案1】:

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

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

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

当然你可以用source ~/.bash_exit替换command to execute,然后把所有的命令放在你家目录下的.bash_exit文件中。

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

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

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

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

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

【讨论】:

  • 这假定终端在你杀死它时会向它的孩子发送一个 HUP 信号。我不在一个可以试验的地方,但这听起来像是可能取决于终端或桌面环境或窗口管理器的行为,因此提及您在哪里测试过可能是有意义的。
  • 我完全支持你。我从 gnome-terminal 收到了我的 SIGHUP 并检查了其他一些问题/答案,其中相同的信号是从 lxterminal、xterm 甚至 tmux 发送的,但没有任何图形界面(参见 herehere)。我还没有找到任何指示发送 SIGHUP 的标准,但由于 Wikipedia 将 SIGHUP 定义为 "signal sent to a process when its controlling terminal is closed." 我只是假设这是事实上的标准。
  • 总之,我找到了一种不使用 SIGHUP 的方法,由于其他原因,这也很成问题。
  • @Socowi,vscode 有办法杀死终端,不幸的是它不会触发您在上面发布的命令。如果环境很重要,我不知道,我使用的是 Windows 和 Git bash。
  • 是的,终端可以有所作为,但最大的问题可能是windows。信号、陷阱和 TTY 是 Linux 的东西。不确定这在 Windows 上的 git bash 中有多少工作。首先,您可以尝试删除 [ -t 0 ] || 部分,看看是否有效。
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2017-03-31
  • 2019-08-19
相关资源
最近更新 更多