在bash中如何检查进程是否运行

时间:2019-11-20 08:52:57  来源:igfitidea点击:

问题

在Linux上如何检查进程是否运行?
如何确定进程是否在Ubuntu服务器上运行?

解决方案

Linux和Unix中有各种命令可以用来检查进程。并通过检查结果来执行某些操作,比如重启进程或者发送告警邮件等。

使用Bash命令检查进程是否正在运行

使用Bash命令检查进程运行的过程:

  • 使用pgrep 命令查看Linux上当前正在运行的进程,并在屏幕上列出进程ID(PID)。
  • 使用pidof命令查找Linux或类Unix系统上正在运行的程序的进程ID
  • 使用ps命令获取有关当前正在运行的Linux或Unix进程的信息,包括其进程标识号(PID)。

什么是Linux或Unix进程?

Linux进程是程序的执行(即运行)实例。

例如,Apache或Nginx Web服务器在Linux或类Unix系统上运行,在后台显示网页。
在后台运行的所有进程都称为守护进程
因此,我们说nginx或httpd守护程序正在服务器上运行。

如何确认Nginx或HTTPD正在运行?

Nginx进程是否正在运行?

执行以下pgrep命令:

pgrep nginx
pgrep httpd
pgrep -x mysqld

如果该进程正在运行,可以看到输出;否则,没有输出。

使用pidof命令检查进程

语法为:

pidof program
pidof httpd
pidof mysqld
pidof nginx

使用ps检查进程是否正在运行

语法是:

ps -C daemon
ps -C nginx
ps -C httpd

通常将grep命令或egrep命令与ps一起使用,如下所示:

ps aux | grep nginx
ps aux | egrep -i "(nginx|httpd)"

在Shell脚本中,确定进程是否正在运行

在Linux或Unix 中,每个bash shell命令在正常或异常终止时都会返回一个状态。

在shell脚本中,可以使用这个命令退出状态来确定下一步的操作。
我们可以使用特殊shell变量$?来获取先前执行的命令的退出状态。

例如:

pgrep -x mysqld
echo $?
pgrep -x nginx
echo $?
pidof httpd
echo $?
ps -C httpd
echo $?

退出状态为0表示命令成功执行,没有任何错误。
非零(1-255值)的退出状态表示命令失败。

在Linux/Unix bash命令中检查进程是否正在运行

根据退出状态值来检查是否找到了该进程:

###################
## pgrep example ##
###################
pgrep -x mysqld >/dev/null && echo "Process found" || echo "Process not found"
pgrep -x httpd >/dev/null && echo "Process found" || echo "Process not found"
 
###################
## pidof example ##
###################
pidof httpd >/dev/null && echo "Service is running" || echo "Service NOT running"
pidof nginx >/dev/null && echo "Service is running" || echo "Service NOT running"
 
################
## ps example ##
################
ps -C httpd >/dev/null && echo "Running" || echo "Not running"
ps -C nginx >/dev/null && echo "Running" || echo "Not running"

在Bash Shell脚本中判断进程是否运行

Bash if..else..fi语句可以根据命令的执行状态进行下一步操作:

#!/bin/bash
SERVICE="nginx"
if pgrep -x "$SERVICE" >/dev/null
then
    echo "$SERVICE is running"
else
    echo "$SERVICE stopped"
    # systemctl start nginx
fi

关于service和systemctl命令

在Linux下,可以使用systemctl命令来控制systemd系统。它也可以提供服务状态。

例如,检查nginx是正在运行,请运行:

systemctl status {service}
systemctl status sshd
systemctl status nginx

较早的Linux发行版和Unix之类的系统(例如FreeBSD),使用service命令。语法为:

sudo service {service} status
sudo service nginx status
sudo service sshd status

总结

我们学习了如何确定某个进程是否正在运行,以及在shell脚本中如何根据状态来启动/停止进程。
有关更多信息,请参见pgrep和bash手册页。