当我启动我的开发环境时,我需要在后台运行各种进程。单独启动它们很痛苦,所以我想编写一个启动每个脚本的脚本。我可以很好地做到这一点,但是当我需要重新启动它们时就会出现问题(这是我需要定期做的事情)。
在启动并保存该信息时捕获进程的最简单方法是什么,以便当我再次运行脚本时,它将检查该信息是否已保存,然后在重新启动它们之前关闭这些进程。
我还希望脚本足够灵活,以便如果我手动关闭进程,它将 a) 如果找不到进程,则不会抛出错误,并且 b) 不会意外关闭一些其他进程,此后已共享任何内容我存储的识别信息。
更具体地说,我现在至少要做到以下几点:
1)输入一个简短的命令,如“start-dev”
2) 执行以下命令(请注意,我希望第二个和第三个命令在后台运行,并且正在使用 & 这样做,但不是最后一个命令,因为我希望看到乘客在运行时的输出):
到目前为止,我已经得到了这个
#!/bin/bash
cd ~/path/to/my/working-directory
rackup faye.ru -s thin -E production &
watch refresh.watchr &
passenger start
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是当我需要重新启动所有这些进程时问题就出现了。我首先必须追踪他们所有的进程 ID,然后在再次运行 start-dev 之前杀死它们。因此,我想:
4) 输入一个像“restart-dev”这样的简短命令,它会跟踪我之前在后台运行的进程,然后在再次运行“start-dev”之前杀死它们。如果我手动关闭了其中任何一个并且不会意外关闭不正确的进程,它需要能够不抛出错误。
我会像这样处理它。
#!/bin/bash
startme() {
cd ~/path/to/my/working-directory
rackup faye.ru -s thin -E production &
watch refresh.watchr &
passenger start
}
stopme() {
pkill -f "rackup faye.ru"
pkill -f "watch refresh.watchr"
}
case "$1" in
start) startme ;;
stop) stopme ;;
restart) stopme; startme ;;
*) echo "usage: $0 start|stop|restart" >&2
exit 1
;;
esac
Run Code Online (Sandbox Code Playgroud)