我有一个脚本foo
,如果提供参数start
,则会在后台启动脚本bar
,然后退出 - bar
包含无限环。
在稍后阶段,我想使用参数foo
调用stop
,我希望仍在后台运行的脚本bar
停止运行。
实现这一目标的教科书是什么方式?
答案 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
或者,当您调用pkill
时,可以使用foo stop
来切换符合特定条件的所有进程的PID。这可能更容易,但也可能更脆弱。