如何仅在服务未运行时尝试启动它?(Linux)

如何仅在服务未运行时尝试启动它?(Linux)

我知道我必须计算有多少个实例正在运行:

ps x | grep apache2 | wc -l 

如果正在运行则结果为:2,否则为:1

我还知道有一个名为的命令test可以用来执行验证,但我不知道如何test使用wc

答案1

大多数 Linux 发行版上的启动脚本都会处理这个问题,方法是保存进程 ID启动服务(守护进程)时。

这些 PID 通常存储在 中/var/run/。例如,在我的系统上,Apache2 将其原始或父进程 ID(对预分叉进程有用)存储在 中/var/run/apache2.pid。因此,您可以向进程发送诸如SIGHUP或 之类的信号SIGSTOP,以发出配置重新加载或停止服务(守护进程)的信号。

有一点可以帮助您进行ps ax样式过程搜索,那就是使用一个小技巧来逃避用于匹配的 grep 的正则表达式模式,这样它就不会匹配自身。例如ps ax | grep [a]pache2 | wc -l

man test为您提供命令的基础知识test。对于 shell 脚本中的简单任务,最好避免依赖于您正在使用的 shell。通常对于基本脚本,建议编写针对 Borne Shell(/bin/sh)的脚本,因为这往往是最流行的最低公分母。

#!/bin/sh

RC= `ps ax | grep [a]pache2 | wc -l`

if [ $RC -gt 0 ]; then
  kill -SIGSTOP `cat /var/run/apache2.pid`
fi

答案2

如果你使用 bash,你可以使用条件检查

#/bin/bash
数字=“1”
如果 [ $num -eq "1" ]; 那么
        回显“得到 1”

如果 [ $num -eq "2" ]; 那么
        回显“得到 2”

答案3

if (( $(ps x | grep [a]pache2 | wc -l) > 0 ))
then
    do_something
else
    do_something_else
fi

或者

case $(ps x | grep [a]pache2 | wc -l) in
    0)
        do_zero_thing
        ;;
    1)
        do_one_thing
        ;;
    *)
        do_default_thing
        ;;
esac

命令中以这种方式使用的方括号grep会阻止其grep本身包含在其自己的输出中。如果 apache 未运行,这将使进程计数为 0。

相关内容