在伪代码中我试图做类似下面的事情
if myService is running
restart myService
else
start myService
如何将上述内容翻译成bash脚本或类似内容?
答案 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