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

Rup*_*ott 7 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
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是当我需要重新启动所有这些进程时问题就出现了。我首先必须追踪他们所有的进程 ID,然后在再次运行 start-dev 之前杀死它们。因此,我想:

4) 输入一个像“restart-dev”这样的简短命令,它会跟踪我之前在后台运行的进程,然后在再次运行“start-dev”之前杀死它们。如果我手动关闭了其中任何一个并且不会意外关闭不正确的进程,它需要能够不抛出错误。

gle*_*man 9

我会像这样处理它。

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