0

我制作了以下代码来确定进程是否正在运行:

#!/bin/bash
ps cax | grep 'Nginx' > /dev/null
if [ $? -eq 0 ]; then
  echo "Process is running."
else
  echo "Process is not running."
fi

我想使用我的代码检查多个进程并使用列表作为输入(见下文),但卡在 foreach 循环中。

CHECK_PROCESS=nginx, mysql, etc

使用 foreach 循环检查多个进程的正确方法是什么?

4

3 回答 3

4

如果您的系统已经pgrep安装,您最好使用它而grep不是ps.

关于您的问题,如何遍历进程列表,您最好使用数组。一个工作示例可能是这样的:

(备注:避免大写变量,这是一个非常糟糕的 bash 做法):

#!/bin/bash

# Define an array of processes to be checked.
# If properly quoted, these may contain spaces
check_process=( "nginx" "mysql" "etc" )

for p in "${check_process[@]}"; do
    if pgrep "$p" > /dev/null; then
        echo "Process \`$p' is running"
    else
        echo "Process \`$p' is not running"
    fi
done

干杯!

于 2012-11-11T12:05:46.617 回答
2

使用单独的进程列表:

#!/bin/bash
PROC="nginx mysql ..."
for p in $PROC
do
  ps cax | grep $p > /dev/null

  if [ $? -eq 0 ]; then
    echo "Process $p is running."
  else
    echo "Process $p is not running."
  fi

done

如果您只是想查看其中任何一个是否正在运行,那么您不需要 loo。只需将列表提供给grep

ps cax | grep -E "Nginx|mysql|etc" > /dev/null
于 2012-11-11T12:01:20.413 回答
1

创建文件 chkproc.sh

#!/bin/bash

for name in $@; do
    echo -n "$name: "
    pgrep $name > /dev/null && echo "running" || echo "not running"
done

然后运行:

$ ./chkproc.sh nginx mysql etc
nginx: not running
mysql: running
etc: not running

除非你有一些旧的或“奇怪”的系统,否则你应该有pgrep可用。

于 2012-11-11T12:15:34.177 回答