【发布时间】:2017-08-16 00:35:21
【问题描述】:
我有一个脚本foo,如果提供了一个参数start,它会在后台启动一个脚本bar并退出——bar包含一个无限循环。
在稍后阶段,我想用参数stop 调用foo,并且我希望仍在后台运行的脚本bar 停止运行。
实现这一点的教科书方法是什么?
【问题讨论】:
-
当您运行
foo start并且bar的实例已经在运行时会发生什么?
我有一个脚本foo,如果提供了一个参数start,它会在后台启动一个脚本bar并退出——bar包含一个无限循环。
在稍后阶段,我想用参数stop 调用foo,并且我希望仍在后台运行的脚本bar 停止运行。
实现这一点的教科书方法是什么?
【问题讨论】:
foo start 并且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
【讨论】:
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。这可能更容易,但也可能更脆弱。
【讨论】: