终止从foo脚本

问题描述:

shell脚本吧我有一个脚本foo,如果提供参数start,开始,除其他事情的背景和退出脚本bar - bar包含一个无限循环。终止从foo脚本

在稍后阶段,我想拨打foo并将参数stop与我想要的脚本bar,仍然运行在后台停止运行。

什么是实现这个文本书的方式?

+0

当你运行'foo start'并且'bar'的一个实例已经在运行时会发生什么? – randomir

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

很好的解决方案,谢谢!有一个问题:在停止部分,我们不应该删除pidfile作为最后的指令吗?否则,我们总是会在echo“$ pidfile exists”结束。案例 – user695652

+0

你是对的,很好地发现。修正了,谢谢。 – randomir

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

另外,您可以使用pkill到dicover符合特定条件时,你叫foo stop所有进程的PID。这可能更容易,但也可能更脆弱。