当我启动开发环境时,我需要在后台运行各种进程。单独启动它们很麻烦,所以我想编写一个脚本来启动每个进程。我可以很好地做到这一点,但当我需要重新启动它们时(我需要定期执行此操作),问题就出现了。
在启动进程时捕获进程并保存该信息的最简单方法是什么,以便当我再次运行脚本时,它将检查该信息是否已保存,然后在重新启动这些进程之前关闭它们。
我还希望脚本足够灵活,以便如果我手动关闭该进程,它将 a) 如果找不到该进程则不会抛出错误,并且 b) 不会意外关闭从那时起共享我存储的任何识别信息的其他进程。
更新
更具体地说,我目前至少想做以下事情:
1)输入一个简短的命令,如“start-dev”
2)执行以下操作(请注意,我希望第二和第三个命令在后台运行,并使用&来执行此操作,但不执行最后一个命令,因为我想在运行时查看乘客的输出):
- 更改为我的工作目录
- 启动 faye 作为后台进程
- 启动 watchr 作为后台进程
- 开始乘客
到目前为止我已经得到了这个
#!/bin/bash
cd ~/path/to/my/working-directory
rackup faye.ru -s thin -E production &
watch refresh.watchr &
passenger start
这很好,但是当我需要重新启动所有这些进程时,问题就出现了。我首先必须找到它们的所有进程 ID,然后在再次运行 start-dev 之前终止它们。因此,我想:
4) 输入一个简短的命令,如“restart-dev”,它会跟踪我之前在后台运行的进程,然后在再次运行“start-dev”之前终止它们。如果我手动关闭了其中任何一个进程,它需要能够不抛出错误,并且不会意外关闭错误的进程。
答案1
我会用类似这样的方法来解决它。
#!/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
答案2
我想说你可能想尝试编写一个 upstart 脚本来管理这些进程。Upstart 是一个非常适合管理系统守护进程的工具,但它也适用于任何你想控制其状态的进程。
upstart 脚本会跟踪进程,但它也允许您编写脚本以在停止进程之前发生某些事情。
stop on runlevel [06]
expect fork
respawn
script
# run your process here
# you might want to su to change user from root
end script
pre-stop script
# things in here will run before the command is halted
end script
将其保存为/etc/init/devenvironment.conf
,然后您就可以使用以下命令控制它:
sudo start devenvironment
sudo stop devenvironment
sudo restart devenvironment