我写了下一个剧本:
process="$1"
if [ -z "$1" ]; then
echo "Please specify a process to check"
exit 1
fi
ps -ef | grep "$process" | grep -v {grep\|$(basename $0)} > /tmp/procs
if [ "$?" -eq "0" ]; then
stat="OK"
exitcode="0"
msg="Process $process is running"
else
stat="Critical"
exitcode="2"
msg="There are currently no running processes of $process"
fi
echo "$stat: $msg"
exit $exitcode
该脚本应检查给定进程是否正在运行并输出相关消息。
在脚本中,我使用以下命令查找进程是否正在运行:
ps -ef | grep $process
问题是当脚本运行时,进程名称还包含$ process字,因此,它会找到实际进程和脚本进程(因为命令中提到了$ process)。 / p>
示例:
[root@pnmnjs2 ~]# sh -x check_proc_nodeJS.sh dakjdhak
+ process=dakjdhak
+ '[' -z dakjdhak ']'
+ ps -ef
++ basename check_proc_nodeJS.sh
+ grep -v '{grep|check_proc_nodeJS.sh}'
+ grep dakjdhak
+ '[' 0 -eq 0 ']'
+ stat=OK
+ exitcode=0
+ msg='Process dakjdhak is running'
+ echo 'OK: Process dakjdhak is running'
OK: Process dakjdhak is running
+ exit 0
[root@pnmnjs2 ~]#
含义:没有名为“dakjdhak”的实际进程,但是当脚本运行ps -ef
命令时,它还会捕获正在运行的脚本的进程,然后返回该进程存在并运行...这是错。
如果没有正在运行的脚本进程,我怎样才能“捕获”相关进程?
(command | grep -v {grep\|$(basename $0)}
的添加应该已经完成了......但它没有...
提前致谢
答案 0 :(得分:2)
您可以使用ps
:
grep
的输出汇总到pgrep
。
# change this
# ps -ef | grep "$process" | grep -v {grep\|$(basename $0)} > /tmp/procs
# if [ "$?" -eq "0" ]; then
# to this
if pgrep "$process" > /tmp/procs; then
如果您想知道命令的返回值,则无需将$?
与[
一起使用 - 只需直接测试命令。
答案 1 :(得分:1)
使用你的过程swtiches的一个小指针
ps -ef
-e开关将显示所有正在运行的进程,包括当您立即使用管道命令时
grep "$process" | grep -v {grep\|$(basename $0)}
因此,您永远不会收到错误
例如
ps -ef|grep "xxx" # if xxx is not running
输出(你的脚本)
OK: Process xxxxxx is running
您刚刚执行了运行的进程grep(如果grep对进程命令使用-ef参数成功,则无关紧要)。进程命令参见grep ran,结果没有捕获到错误。
您可以使用的是
ps -A or ps -C
答案 2 :(得分:0)
您可以使用ps -C "$process"
使用其可执行文件名称comm
, not args
)查找进程。