![如何监控应用程序何时关闭?](https://linux22.com/image/196348/%E5%A6%82%E4%BD%95%E7%9B%91%E6%8E%A7%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%BD%95%E6%97%B6%E5%85%B3%E9%97%AD%EF%BC%9F.png)
我想监视我的 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,我不知道它是否这样做过,也不知道它以什么方式这样做。PATH
atom
whatever
PATH