如何监控应用程序何时关闭?

如何监控应用程序何时关闭?

我想监视我的 Atom 文本编辑器,以便在它关闭时运行脚本。

我想使用命令行语法打开编辑器atom。当我关闭编辑器时,我希望它触发 bash 脚本。

我怎样才能做到这一点?

答案1

我想使用命令行语法打开编辑器atom。当我关闭编辑器时,我希望它触发 bash 脚本。

创建一个真正运行的 shell 函数或脚本atom,然后whatever接下来要运行。


示例函数

atom () (
  command atom "$@"
  /path/to/whatever
)

在右侧启动文件中定义函数(~/.bashrc对于 Bash)。打开一个新的外壳。从现在开始,atom从 shell 调用应该运行该函数。此方法在 shell 之外不起作用。


示例脚本

(注意:将函数和脚本一起使用是没有意义的。)

#!/bin/sh
/path/to/real/atom "$@"
/path/to/whatever

将脚本命名为atom,使其可执行并将其放置在您的目录中,该PATH目录比任何其他目录都早atom(您可能需要创建此类目录并修改您的PATH)。现在任何使用PATH变量来定位的东西atom都会找到脚本。该方法可以在 shell 之外工作。

但是,如果任何东西尝试通过其通常的路径(即不是通过)运行Atom,PATH那么它将atom像脚本一样运行真实的。您可以将真实值移至atom其他地方,将脚本放置在每个人都期望真实值的位置atom(并/path/to/real/atom在脚本中进行调整,以便脚本不会调用自身);但我不建议这样做,因为尝试更新 Atom 很可能会覆盖脚本。


可能的改进

  • 上面的函数或上面的脚本以退出状态退出,whatever因为它是最后一个命令。也许您希望它以 real 的退出状态退出atom。这对于脚本来说尤其合理。该名称下的脚本atom可能会被任何想要运行真实程序的程序调用atom,并且我们不能排除某些调用进程使用 的退出状态来atom执行某些操作。

    保留退出状态的函数如下所示:

    atom () (
       command atom "$@"
       status="$?"
       /path/to/whatever
       exit "$status"
    )
    

    (故意在子 shell 中运行函数,因此它的status变量不会影响主 shell。)

    同样的脚本:

    #!/bin/sh
    /path/to/real/atom "$@"
    status="$?"
    /path/to/whatever
    exit "$status"
    
  • 您可能希望函数或脚本在真正退出后尽快退出atom,您可能希望whatever异步启动。让函数/脚本运行/path/to/whatever &而不是/path/to/whatever然后。


一般注意事项

  • 我们的函数或脚本whatever在之后运行运行真正的atom. Real 是否atom显示窗口或是否启动都无关紧要。通过测试退出状态,您可以检测一些异常(例如,如果/path/to/real/atom触发No such file or directory则退出状态127)并有条件地抑制whatever。如果“当应用程序关闭时”是指“当其窗口关闭时”,那么事情就没那么简单了。

  • 一般来说,像浏览器或文本编辑器这样的程序,如果第二次调用,可能会检测到另一个已经在运行的实例,并将其自己的任务委托给另一个进程。实际上,例如在旧窗口中创建了新选项卡或其他内容。新进程在任务移交后立即退出;该任务成为旧实例的责任。如果 Atom 这样做,那么您将观察到whatever(与新进程关联)在新进程委托任务并退出后立即运行,即使任务本身还远未完成/关闭。我不了解Atom,我不知道它是否可以这样工作。

  • 一般来说,一个进程可以调用它自己的可执行文件或其名称来生成另一个实例(可能是静默的并且没有任何窗口)。如果 Atom(即真正的)曾经以用于定位atom的方式执行此操作,并且如果它找到脚本,那么您将观察到比您预期更多的实例。有些方法不使用.再说一遍:我不了解 Atom,我不知道它是否这样做过,也不知道它以什么方式这样做。PATHatomwhateverPATH

相关内容