在伪代码中,我正在尝试执行以下操作
if myService is running
restart myService
else
start myService
如何将以上内容翻译成 bash 脚本或类似内容?
标准方法是使用 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
来匹配用于启动服务的完整命令行。
如果您在运行ps aux时看到myService,那么您可以简单地在 bash 中执行此操作(编辑为使用 pgrep,如 jordanm 建议的那样):
if [ $(pgrep myService) ]; then
restart myService;
else
start myService;
fi