如何检测我的upstart脚本是否正在运行?

时间:2012-06-03 02:37:57

标签: bash ubuntu upstart

在伪代码中我试图做类似下面的事情

if myService is running
  restart myService
else
  start myService

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

2 个答案:

答案 0 :(得分:5)

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

查看/etc/init.d目录下的各种脚本,看看它们如何使用PID文件。另请查看大多数Linux系统中/var/run下的内容,了解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命令本身的退出状态。

阅读MANPAGE ON PGREP

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

答案 1 :(得分:0)

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

if [ $(pgrep myService) ]; then
    restart myService;
else
    start myService;
fi