【问题标题】:Terminating a shell script bar from a script foo从脚本 foo 终止 shell 脚本栏
【发布时间】:2017-08-16 00:35:21
【问题描述】:

我有一个脚本foo,如果提供了一个参数start,它会在后台启动一个脚本bar并退出——bar包含一个无限循环。

在稍后阶段,我想用参数stop 调用foo,并且我希望仍在后台运行的脚本bar 停止运行。

实现这一点的教科书方法是什么?

【问题讨论】:

  • 当您运行foo start 并且bar 的实例已经在运行时会发生什么?

标签: bash scripting kill


【解决方案1】:

如果多个bar 实例可以同时运行,而foo stop 应该停止/杀死它们,请使用pkill

$ pkill bar

杀死所有名为bar的进程。

如果只允许运行一个bar 实例,则具有“pidfile”的解决方案将是可行的。

foo:

pidfile=/var/run/bar.pid

if ((start)); then
    if [ -e "$pidfile" ]; then
        echo "$pidfile exists."
        # clean-up, or simply abort...
        exit 1
    fi
    bar &
    echo $! >"$pidfile"
fi

if ((stop)); then
    if [ ! -e "$pidfile" ]; then
        echo "$pidfile not found."
        exit 1
    fi
    kill "$(<"$pidfile")"
    rm -f "$pidfile"
fi

【讨论】:

  • 很好的解决方案,谢谢!曾经的问题:在停止部分,我们不应该将pidfile作为最后一条指令删除吗?否则我们总是会在 echo "$pidfile exists." 中结束。案例
【解决方案2】:

There are better ways to do what you're trying to do I believe 如果您的主机有 systemd 或 initd,则已经有框架可以提供具有启动/停止功能的长时间运行的作业。

如果你必须独立于那些或其他有用的工具来做这件事,我会这样解决它:

当您调用foo start 时,将新生成的bar 进程的PID 存储在一个文件中,我们称之为pidfile。这也可以是换行符分隔的 PID 列表。

当您调用foo stop 时,使用pkill -F pidfile 杀死所有正在运行的进程,其PID 与pidfile 中的PID 匹配

或者,当您调用foo stop 时,您可以使用pkill 来发现符合特定条件的所有进程的PID。这可能更容易,但也可能更脆弱。

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 2011-03-08
    • 1970-01-01
    • 2016-09-29
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多