终止由 bash 脚本启动的后台进程

终止由 bash 脚本启动的后台进程

我想在后台运行 CoffeeScript 和 Sass 编译器,并能够同时终止它们。我有一个 bash 脚本start,如下所示:

coffee --watch -o assets/ -c src/ &
sass --watch src:assets &

从脚本文件启动时,它们不会出现在作业列表中,所以我无法使用以下方法杀死它们:

kill `jobs -p`

就像建议的那样帖子。它们确实出现在ps输出中,并附加到我的 tty。

有什么好方法可以终止我的脚本启动的进程start

我的目标是启动编译器./start并用./stop脚本终止它们。我使用的是 OSX Lion。

编辑:根据 Grawity 的回答,我现在使用:

coffee --watch -o assets/ -c src/ &
coffeepid=$!
sass --watch src:assets
kill $coffeepid

如果使用停止,Sass 编译器会抱怨kill,因此我使用 Ctrl-C 停止它,然后终止后台 CoffeeScript 编译器。

答案1

您正在使用 MacOS X。系统附带一种运行用户守护进程的方法,可根据需要启动和停止它们。(在 MacOS 中,它们的正确名称是用户代理它是launchd,并且它的接口是launchctl. 每次登录会话执行一次此操作(根据需要将编译器的路径名修改为绝对形式):

 launchctl submit -l com.example.coffee -- ${BINDIR}/coffee --watch -o assets/ -c src/
 launchctl submit -l com.example.sass -- ${BINDIR}/sass --watch src:assets

在您的启动/停止脚本中:

 launchctl start com.example.coffee
 launchctl start com.example.sass
 launchctl stop com.example.coffee
 launchctl stop com.example.sass

可怕的易发生事故的 pid 文件。进程表中没有 grep 不匹配。没有混乱。没有麻烦。

当然, Library/LaunchAgents如果您愿意,您可以发挥创意,使用属性列表并将其添加到您的目录中 — 一个简单的属性列表文件并不难拼凑起来。但是launchctl submit对于像这样的随机用户代理来说,是否还有这样的文件呢?

答案2

从 ps 中过滤出 PID,然后将其提供给 kill (本例中为 kill ping):

ps -A | grep ping | awk '{print $1}' | xargs kill

相关内容