从脚本foo终止shell脚本栏

时间:2017-08-16 00:35:21

标签: bash scripting kill

我有一个脚本foo,如果提供参数start,则会在后台启动脚本bar,然后退出 - bar包含无限环。

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

实现这一目标的教科书是什么方式?

2 个答案:

答案 0 :(得分:2)

如果多个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

答案 1 :(得分:0)

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匹配

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