我想检查一个进程是否启动:
[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