pidof [选项] 进程名...
| 选项 | 说明 |
|---|---|
-s |
只返回一个PID(单次返回) |
-c |
只返回相同root目录下的进程PID |
-x |
同时返回运行指定脚本的shell进程的PID |
-o PID |
排除指定的PID(可以多次使用) |
-h |
显示帮助信息 |
-V |
显示版本信息 |
| 命令 | 特点 | 使用场景 | 输出格式 |
|---|---|---|---|
pidof |
简单直接,只查找PID | 快速查找进程ID,脚本中使用 | 一行显示所有PID,空格分隔 |
pgrep |
功能丰富,选项多 | 复杂查找,需要更多匹配条件 | 默认每行一个PID,可自定义分隔符 |
ps + grep |
功能最强大,可获取所有信息 | 需要查看进程详细信息时 | 需要解析输出 |
pstree -p |
显示进程树结构 | 查看进程父子关系 | 树形结构显示 |
# 查找nginx进程的所有PID
pidof nginx
# 查找sshd进程的所有PID
pidof sshd
# 只返回一个nginx进程的PID
pidof -s nginx
# 查找nginx进程PID,但排除PID 1234
pidof -o 1234 nginx
# 排除多个PID
pidof -o 1234 -o 5678 nginx
# 同时查找nginx和mysql进程的PID
pidof nginx mysql
# 创建测试脚本
echo 'sleep 100' > /tmp/test.sh
chmod +x /tmp/test.sh
# 在后台运行脚本
/tmp/test.sh &
# 查找脚本进程的PID(包括shell进程)
pidof -x test.sh
# 在chroot环境中使用
pidof -c nginx
#!/bin/bash
# 检查服务是否运行
SERVICE="nginx"
PID=$(pidof $SERVICE)
if [ -z "$PID" ]; then
echo "$SERVICE 没有运行"
# 启动服务的代码
else
echo "$SERVICE 正在运行,PID: $PID"
fi
# 使用pidof杀死所有nginx进程
kill $(pidof nginx)
# 优雅地重启nginx
kill -HUP $(pidof nginx)
# 停止所有apache进程
kill -9 $(pidof apache2)
# 统计nginx进程数量
pidof nginx | wc -w
# 监控进程数量,如果超过5个就报警
COUNT=$(pidof nginx | wc -w)
if [ $COUNT -gt 5 ]; then
echo "警告: nginx进程数量异常: $COUNT"
fi
# 使用pidof的结果查看进程详细信息
for PID in $(pidof nginx); do
echo "PID: $PID"
ps -p $PID -o pid,ppid,user,cmd
echo "---"
done
$ pidof nginx
1234 1235 1236 1237
$ pidof -s nginx
1234
$ pidof nginx
1234 1235 1236 1237
$ pidof -o 1234 nginx
1235 1236 1237
$ pidof nginx mysql
1234 1235 1236 1237 3306 3307
$ pidof nonexistent
# 没有输出,返回值为1
| 返回值 | 说明 |
|---|---|
| 0 | 成功找到至少一个匹配的进程 |
| 1 | 没有找到匹配的进程,或命令语法错误 |
| 2 | 使用了不支持的选项 |
#!/bin/bash
# nginx服务管理脚本
NGINX_PID=$(pidof nginx)
case "$1" in
start)
if [ -n "$NGINX_PID" ]; then
echo "nginx已经在运行,PID: $NGINX_PID"
exit 1
fi
echo "启动nginx..."
/usr/sbin/nginx
;;
stop)
if [ -z "$NGINX_PID" ]; then
echo "nginx没有在运行"
exit 1
fi
echo "停止nginx..."
kill -TERM $NGINX_PID
;;
restart)
echo "重启nginx..."
kill -HUP $NGINX_PID 2>/dev/null || /usr/sbin/nginx
;;
status)
if [ -n "$NGINX_PID" ]; then
echo "nginx正在运行,PID: $NGINX_PID"
# 显示详细信息
ps -p $NGINX_PID -o pid,ppid,user,%cpu,%mem,cmd
else
echo "nginx没有在运行"
fi
;;
*)
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
#!/bin/bash
# 监控关键进程
# 要监控的进程列表
PROCESSES=("nginx" "mysql" "php-fpm" "redis-server")
# 监控间隔(秒)
INTERVAL=60
while true; do
echo "=== 进程监控报告 $(date) ==="
for PROC in "${PROCESSES[@]}"; do
PIDS=$(pidof $PROC)
COUNT=$(echo $PIDS | wc -w)
if [ $COUNT -eq 0 ]; then
echo "[警告] $PROC 没有运行!"
elif [ $COUNT -lt 2 ] && [[ "$PROC" == "nginx" || "$PROC" == "php-fpm" ]]; then
echo "[注意] $PROC 进程数量较少: $COUNT"
else
echo "[正常] $PROC: $COUNT 个进程, PID: $PIDS"
fi
# 记录到日志文件
echo "$(date) - $PROC - $COUNT - $PIDS" >> /var/log/process_monitor.log
done
echo ""
sleep $INTERVAL
done
-s选项可以只返回一个PID/usr/sbin/nginx和nginx可能不同在现代Linux系统中,systemd已经成为主流的初始化系统,pidof可以与systemd命令配合使用:
# 使用systemctl获取服务状态,再用pidof验证
systemctl status nginx.service
# 如果systemd服务文件定义了PIDFile,可以直接读取
cat /run/nginx.pid
# 使用systemctl show获取服务的PID
systemctl show --property MainPID nginx.service
# 结合使用:如果systemd管理的服务,优先使用systemctl
if systemctl is-active nginx.service >/dev/null 2>&1; then
# 获取systemd管理的服务PID
PID=$(systemctl show --property MainPID nginx.service | cut -d= -f2)
else
# 回退到pidof
PID=$(pidof nginx)
fi
pidof命令通常包含在sysvinit-tools或sysvinit软件包中,大多数Linux发行版默认已安装。
# 检查是否已安装
which pidof
或
pidof --help
# Ubuntu/Debian安装(如果需要)
sudo apt-get install sysvinit-utils
# CentOS/RHEL/Fedora安装
sudo yum install sysvinit-tools
# Arch Linux
sudo pacman -S sysvinit
# 验证安装
pidof -V
可能的原因:
ps aux查看确切的进程名称)可以使用ps -ef或pstree -p查看进程关系:
# 查看进程父子关系
ps -ef | grep nginx
pstree -p | grep nginx
# 通常主进程(master)的PPID是1,工作进程的PPID是主进程的PID
建议使用更安全的信号和验证:
# 先优雅地停止(SIGTERM)
kill -TERM $(pidof nginx) 2>/dev/null
# 等待进程退出
sleep 5
# 如果进程还在,强制杀死(SIGKILL)
if pidof nginx >/dev/null; then
echo "进程仍在运行,强制杀死..."
kill -9 $(pidof nginx)
fi