【问题标题】:How to notify another shell script if a running shell script is stopped?如果正在运行的 shell 脚本停止,如何通知另一个 shell 脚本?
【发布时间】:2021-08-27 08:27:58
【问题描述】:

我运行一个 shell 脚本,比如脚本 1。我暂停脚本 1 的执行并给出 bg 命令,以便它开始在后台运行。我启动另一个脚本 2,它再次暂停并在后台运行。现在我给出 pkill -f script1.sh 命令来杀死脚本 1。

我想要做的是,当我杀死脚本 1 时,脚本 2 应该知道这一点,然后脚本 2 应该开始运行另一个脚本 3。这怎么办?

【问题讨论】:

  • 向两者添加陷阱(信号处理程序),以便第一个脚本在退出前发出第二个信号,第二个脚本在捕获信号时启动 script3。
  • 脚本1可以创建pid文件和​​lock it;脚本 2 可以启动一个协同进程(或只是在后台运行某些东西),该进程会阻止获取该锁并在脚本 3 获得该锁后启动它。

标签: linux bash shell unix ipc


【解决方案1】:

有不同的方法可以做到这一点。最简单的就是:

script1
^z
bg
script2 $!

script2 的某些战略点:

s1pid=$1
...
if ps $s1pid ; then
    script3
fi
...

您也可以使用 PID 文件。如果只有一个 script1 实例在系统范围内运行,或者您在命名或放置 PID 文件时做了一些技巧(例如,将 PID 文件放在当前目录中),则此方法效果很好。您可以使用 PID 文件中的 PID 来测试 script1 是否仍然运行。

如果你是唯一一个运行这个脚本的人,并且你可以给它命名任何你想要的名字,你可以给它一个唯一的名字。在这种情况下,您可以

if ps -ef | grep some_unique_name ; then
    script3
fi

您也可以按照@jhnc 建议的flock 锁定PID 文件。

如果您在script2 中没有可以轮询script1 的战略点,您可能会得到一些子进程来在后台轮询它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2012-01-11
    • 2021-10-26
    • 2020-11-04
    • 2019-02-10
    • 2013-04-18
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多