shell脚本检查进程是否启动

shell脚本检查进程是否启动

我想检查一个进程是否启动:

[nyxqa@qckmaccg102 scripts]$  ps -fu nyxqa
UID        PID  PPID  C STIME TTY          TIME CMD
nyxqa    19620     1  0 08:42 ?        00:00:00 ./ArcaDirect ITD
nyxqa    19628     1  0 08:42 ?        00:00:00 ./ADViewerWebOps

我想使用 shell 查看 ArcaDirect ITD 进程是否启动

答案1

看到了吧man pgrep。因为我没有ArcaDirect,但是有NetworkManager

(0)$ pgrep NetworkManager
1400
(0)$ pgrep ArcaDirect
(1)$ 

这是我在终端输入的内容

(0)$ pgrep NetworkManager
4011
(0)$ pgrep ArcaDirect
(1)$ if  $(pgrep NetworkManager >/dev/null)  ; then
  echo "Running"
  else
  echo "Restart needed"
  fi
Running
(0)$ if  $(pgrep ArcaDirect >/dev/null)  ; then echo "Running"; else echo     "Restart needed"; fi
Restart needed
(0)$ 

答案2

您的假设up是指在检查时某个进程正在运行。

您可以使用ps(正如您所提到的)或pgrep,因为您想在脚本中使用它,我建议您使用pgrep它的简单性。

例如让我们检查是否firefox正在运行:

$ pgrep firefox  ## Firefox is running, Shows the PID of firefox
17032

$ echo "$?"  ## Exit status is 0 (One (or more) matched process(es) found)
0


$ pgrep firefox  ## Firefox is Not running, Shows nothing

$ echo "$?"  ## Exit code in this case is 1
1

不过有一个非常重要的陷阱,其默认形式pgrep将给定的名称作为正则表达式模式与进程名称进行匹配。因此,如果某个进程的名称类似于 ,firefox_foobar并且您尝试检查它是否firefox正在运行pgrep firefox,它将显示该进程的 PID firefox_foobar。因此,您会认为它firefox正在运行,但实际上并非如此。

以下是一个例子:

$ pgrep firefox_foobar
19002

$ pgrep firefox
19002

为了解决这个问题,您应该使用以下-x选项匹配精确的进程名称pgrep

$ pgrep -x firefox_foobar  ## Shows the PID of firefox_foobar
19002

$ pgrep -x firefox  ##Shows nothing as firefox is not running

简而言之,您的脚本可以采用以下形式:

if pgrep -x 'ArcaDirect ITD' &>/dev/null; then echo "Running"; else echo "Not running"; fi

相关内容