2012-06-03 125 views

回答

5

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

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

你可以做这样的事情是处理这个对所有的Bourne 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来匹配用于启动服务的完整命令行。

0

如果你看到为myService当您运行的ps aux,那么你可以简单地做这在bash(编辑使用p纤ep,为jordanm建议):

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

[]和$()是不必要的。 'pgrep'也更适合。 – jordanm

+0

谢谢,我编辑过使用pgrep。我只能不能删除$()。 –

+1

'if pgrep myService>/dev/null;那么...'。 'if'测试命令的退出状态。 '['是'test'的别名,它是一个命令,不是if语法的一部分。 – jordanm

相关问题