杀死由 bash 脚本启动的后台进程

Dou*_*las 1 terminal kill macos

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

coffee --watch -o assets/ -c src/ &
sass --watch src:assets &
Run Code Online (Sandbox Code Playgroud)

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

kill `jobs -p`
Run Code Online (Sandbox Code Playgroud)

正如这篇文章中所建议的那样。它们确实在ps输出中显示为附加到我的 tty。

杀死我的start脚本启动的进程的好方法是什么?

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

编辑:基于 grawity 的答案,现在我正在使用:

coffee --watch -o assets/ -c src/ &
coffeepid=$!
sass --watch src:assets
kill $coffeepid
Run Code Online (Sandbox Code Playgroud)

Sass 编译器会抱怨它是否停止使用kill,所以我用 Ctrl-C 停止它,然后终止后台 CoffeeScript 编译器。

Jde*_*eBP 5

您使用的是 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
Run Code Online (Sandbox Code Playgroud)

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

 launchctl start com.example.coffee
 launchctl start com.example.sass
 launchctl stop com.example.coffee
 launchctl stop com.example.sass
Run Code Online (Sandbox Code Playgroud)

没有可怕的容易发生事故的 pid 文件。进程表中没有 grep 不匹配。没毛病。别大惊小怪。

当然,您可以通过属性列表发挥创意,并将其添加到您的 Library/LaunchAgents目录中,如果您愿意的话——一个简单的属性列表文件并不难组合在一起。但是launchctl submit有没有像这样的 nonce 用户代理。