在伪代码,我试图做类似下面的如何检测我的新贵脚本是否正在运行?
if myService is running
restart myService
else
start myService
如何翻译到上述bash脚本或类似的?
在伪代码,我试图做类似下面的如何检测我的新贵脚本是否正在运行?
if myService is running
restart myService
else
start myService
如何翻译到上述bash脚本或类似的?
的标准方法是使用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
来匹配用于启动服务的完整命令行。
如果你看到为myService当您运行的ps aux,那么你可以简单地做这在bash(编辑使用p纤ep,为jordanm建议):
if [ $(pgrep myService) ]; then
restart myService;
else
start myService;
fi
[]和$()是不必要的。 'pgrep'也更适合。 – jordanm
谢谢,我编辑过使用pgrep。我只能不能删除$()。 –
'if pgrep myService>/dev/null;那么...'。 'if'测试命令的退出状态。 '['是'test'的别名,它是一个命令,不是if语法的一部分。 – jordanm