如何使用 bash 脚本检查主管进程是 运行 还是已停止

How to check if supervisor process is running or stopped using bash script

我 运行 多个主管进程有时由于服务器过载某些进程 无限期停止 直到您手动重新启动它们。有没有一种方法可以编写一个 bash 脚本,该脚本可以由 crontab 定期执行以检查已停止的进程并重新启动它。

这就是我如何在终端上检查状态、停止或重新启动进程的方法

root@cloud:~# supervisorctl status birthday-sms:birthday-sms_00
birthday-sms:birthday-sms_00     RUNNING   pid 2696895, uptime 0:02:08
root@cloud:~# supervisorctl stop birthday-sms:birthday-sms_00
birthday-sms:birthday-sms_00: stopped
root@cloud:~# supervisorctl status birthday-sms:birthday-sms_00
birthday-sms:birthday-sms_00     STOPPED   May 07 11:07 AM

我不想使用 crontab 以特定时间间隔重新启动所有进程*/5 * * * * /usr/bin/supervisorctl restart all,但我只想检查并重新启动已停止的进程

首先制作并测试一个没有 crontab 的脚本来执行您想要的操作。
当脚本运行时,检查它是否仍然在没有 .bashrc 中的设置的情况下运行,例如 supervisorctl 的路径。 还要检查您的脚本是否没有写入标准输出,也许引入一个日志文件。 接下来将脚本添加到crontab。

#!/bin/bash
for proc in 'birthday-sms:birthday-sms_00' 'process2' 'process3'; do
  # Only during development, you don't want output from cron
  echo "Checking ${proc}"
  status=$(supervisorctl status "${proc}" 2>&1)
  echo "$status"
  if [[ "$status" == *STOPPED* ]]; then
    echo "Restarting ${proc}"
    supervisorctl restart "${proc}"
  fi
done

或使用数组和更短的测试

#!/bin/bash
processes=('birthday-sms:birthday-sms_00' 'process2' 'process3')
for proc in ${processes[@]}; do
  supervisorctl status "${proc}" 2>&1 |
    grep -q STOPPED &&
    supervisorctl restart "${proc}"
done