终止从foo脚本
shell脚本吧我有一个脚本foo
,如果提供参数start
,开始,除其他事情的背景和退出脚本bar
- bar
包含一个无限循环。终止从foo脚本
在稍后阶段,我想拨打foo
并将参数stop
与我想要的脚本bar
,仍然运行在后台停止运行。
什么是实现这个文本书的方式?
如果多个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”结束。案例 – user695652
你是对的,很好地发现。修正了,谢谢。 – 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。这可能更容易,但也可能更脆弱。
当你运行'foo start'并且'bar'的一个实例已经在运行时会发生什么? – randomir