我想在后台运行 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