在所有打开的 shell 中执行命令

在所有打开的 shell 中执行命令

我使用 sshfs 在我的开发盒上做一些有用的事情。我喜欢它。但是,我通常会fusermount -u在合上盖子(触发休眠)之前忘记这样做。然后,当我回来时,sshfs 被冻结了,我必须清理。

我更愿意在 /etc/pm/sleep.d 中有一个脚本来迭代我的所有 sshfs 挂载点和 DWIM。我已经用支票fusermount -u编写了代码df -l。但是,在测试中,我确定我还需要从所有安装点中退出才能fusermount -u工作。

但是,我不知道如何迭代我打开的 bash 终端并在其中做有用的事情。帮助?

答案1

您可以通过在以下位置注册自定义用户信号处理程序来实现此目的~/.bashrc

trap '[ "$PWD" = "/my/sshfs/mount" ] && cd ~' SIGUSR1

SIGUSR1然后,每当您向 bash 进程发送信号时,都会调用此处理程序:

killall -u "$USER" -USR1 bash

这有一些警告:

  • 信号处理程序必须为所有(交互式和非交互式)bash 实例注册,否则将执行默认操作(退出)。我认为使用~/.bashrc通常会做到这一点。但是,bash 的一些选项将覆盖此启动文件的来源。
  • 任何 shell 进程都可能正在执行依赖于给定 sshfs 目录的操作。随机更改此目录可能会导致任意未定义的行为,具体取决于给定脚本当时(或稍后)正在执行的操作。
  • 很可能还有从 bash 进程启动的其他进程仍在给定目录中。对于这些进程,除了杀死它们之外,没有太多可以做的事情。

相关内容