2

在伪代码中,我正在尝试执行以下操作

if myService is running
  restart myService
else
  start myService

如何将以上内容翻译成 bash 脚本或类似内容?

4

2 回答 2

6

标准方法是使用 PID 文件来存储服务的 PID。然后,您可以使用存储在 PID 文件中的 PID 来查看服务是否已经在运行。

看看/etc/init.d目录下的各种脚本,看看它们是如何使用 PID 文件的。还可以/var/run在大多数 Linux 系统中查看 PID 文件的存储位置。

你可以做这样的事情,这是处理所有 Bourne shell 类型 shell 的通用方法:

# Does the PID file exist?

if [ -f "$PID_FILE" ]
then
    # PID File does exist. Is that process still running?
    if ps -p `cat $PID_FILE` > /dev/null 2&1
    then

       # Process is running. Do a restart
       /etc/init.d/myService restart
       cat $! > $PID_FILE
    else
       # Process isn't' running. Do a start
       /etc/init.d/myService start
       cat $! > $PID_FILE
else
   # No PID file to begin with, do a restart
   /etc/init.d/myService restart
   cat $! > $PID_FILE
fi

但是,在 Linux 上,您可以利用pgrep

if pgrep myService > /dev/null 2>&1
then
    restart service
else
    start service
fi

请注意您如何不使用任何大括号。该if语句对pgrep命令的退出状态进行操作。我将 STDOUT 和 STDERR 都输出到 /dev/null 因为我不想打印它们。pgrep我只想要命令本身的退出状态。

阅读PGREP手册

有很多选择。例如,您可能希望使用-x来防止意外匹配,或者您可能必须使用-f来匹配用于启动服务的完整命令行。

于 2012-06-04T18:47:53.723 回答
0

如果您在运行ps aux时看到myService,那么您可以简单地在 bash 中执行此操作(编辑为使用 pgrep,如 jordanm 建议的那样):

if [ $(pgrep myService) ]; then
    restart myService;
else
    start myService;
fi
于 2012-06-03T03:07:32.327 回答