Bash 脚本用于启动然后关闭/重新启动各种进程

Bash 脚本用于启动然后关闭/重新启动各种进程

当我启动开发环境时,我需要在后台运行各种进程。单独启动它们很麻烦,所以我想编写一个脚本来启动每个进程。我可以很好地做到这一点,但当我需要重新启动它们时(我需要定期执行此操作),问题就出现了。

在启动进程时捕获进程并保存该信息的最简单方法是什么,以便当我再次运行脚本时,它将检查该信息是否已保存,然后在重新启动这些进程之前关闭它们。

我还希望脚本足够灵活,以便如果我手动关闭该进程,它将 a) 如果找不到该进程则不会抛出错误,并且 b) 不会意外关闭从那时起共享我存储的任何识别信息的其他进程。

更新

更具体地说,我目前至少想做以下事情:

1)输入一个简短的命令,如“start-dev”

2)执行以下操作(请注意,我希望第二和第三个命令在后台运行,并使用&来执行此操作,但不执行最后一个命令,因为我想在运行时查看乘客的输出):

  1. 更改为我的工作目录
  2. 启动 faye 作为后台进程
  3. 启动 watchr 作为后台进程
  4. 开始乘客

到目前为止我已经得到了这个

#!/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

相关内容