我知道我必须计算有多少个实例正在运行:
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。