Linux里面 grep的用法之根据关键词查询进程PID

本文介绍了一种使用grep结合ps命令来查找特定进程PID的方法。通过组合使用ps、grep及awk命令,可以精确地获取含有特定关键词的进程ID。文章详细解析了各命令的功能及应用场景。

grep的用法,假如我想通过一个关键词来搜索整个关键词的进程的PID
脚本为:

pid =`ps -ef|grep cluster-app.jar |grep -v grep|awk '{print $2}'`

解释这个语句的作用
首先:下面这个脚本,会搜索所有包含 cluster-app.jar 的进程,如下图所示:会有两条数据

ps -ef|grep cluster-app.jar

在这里插入图片描述
其次,介绍grep -v 反向筛选,就是筛选不包含此关键词的数据行,展示

|grep -v grep|

就是把不包含 grep这个关键词的数据行展示,如下图所示:
在这里插入图片描述
最后:用 awk ‘{print $2}’ 来打印PID ,其中 $2 代表第二个列

awk '{print $2}'

最终效果为:
在这里插入图片描述

<think>我们正在讨论Linux系统中根据进程名称查看其PID的方法。根据用户提供的引用,我们可以总结出两种常用方法:使用`pidof`命令和使用`ps`命令结合其他工具(如`grep`、`awk`等)。下面将详细说明这两种方法,并提供一些其他相关技巧。 ### 方法1:使用`pidof`命令 `pidof`是一个专门用于查找运行进程PID的工具,使用简单直接。 ```bash pidof <进程名称> ``` 例如,要查找nginx进程PID: ```bash pidof nginx ``` 如果进程在运行,则输出一个或多个PID(多个PID以空格分隔);如果进程未运行,则无输出。 **优点**:简单快捷,适合脚本中使用。 **缺点**:只能返回进程名称完全匹配的PID。 ### 方法2:使用`ps`命令结合管道 `ps`命令可以列出当前系统的进程状态,通过管道配合`grep`和`awk`等工具可以过滤出特定进程PID。 基础命令: ```bash ps -ef | grep <进程名称> ``` 但这样会同时包含grep进程本身,通常需要进一步过滤: ```bash ps -ef | grep <进程名称> | grep -v grep ``` 为了只获取PID,可以结合`awk`: ```bash ps -ef | grep '<进程名称>' | grep -v grep | awk '{print $2}' ``` 或者使用`pgrep`命令(更简洁): ```bash pgrep <进程名称> ``` ### 方法3:使用`pgrep`命令 `pgrep`命令专门用于根据进程名查找PID,效果与`pidof`类似,但支持更多选项。 ```bash pgrep <进程名称> ``` 例如: ```bash pgrep nginx ``` 常用选项: - `-l`:同时显示进程名和PID。 - `-x`:精确匹配进程名。 - `-f`:匹配整个命令行(而不仅仅是进程名)。 ### 方法4:使用`systemctl`(适用于系统服务) 如果是系统服务,可以使用`systemctl`命令: ```bash systemctl show --property MainPID --value <服务名> ``` 例如,查找nginx服务的PID: ```bash systemctl show --property MainPID --value nginx ``` ### 注意事项 1. **进程名称匹配**:`pidof`和`pgrep`默认进行部分匹配(如`nginx`会匹配`nginx`和`nginx-worker`)。如果需要精确匹配,使用`pgrep -x`。 2. **多实例处理**:如果一个进程有多个实例,以上命令会返回多个PID。 3. **用户权限**:普通用户只能查看自己权限范围内的进程。 ### 示例脚本 用户提供的示例脚本结合了`pidof`和`ps`两种方法: ```bash #!/bin/bash if [ $# -ne 1 ] then echo "Usage : sh pid.sh process_name" exit 1 fi # 方法1: 使用pidof PID1=`pidof $1` if [ -n "$PID1" ] then echo "$1 pid is $PID1" else echo "$1 process is not running!" fi echo "=======================================" # 方法2: 使用ps PID2=`ps -fC $1 | sed '1d' | awk '{print $2}'` if [ -n "$PID2" ] then echo "$1 pid is $PID2" else echo "$1 process is not running!" fi exit 0 ``` ### 相关问题 §§相关问题§§ 1. 如何根据进程名称强制终止进程? 2. 如何实时监控某个进程的资源占用情况? 3. 如何查看进程的父子关系? </think>### Linux系统中根据进程名称查看PID的方法 在Linux系统中,根据进程名称获取PID有多种高效方法。以下是常用的四种方案: --- #### 🔍 方案1:使用`pidof`命令(最简洁) **命令格式**: ```bash pidof <进程名称> ``` **示例**: ```bash $ pidof nginx 8932 8931 8929 # 返回多个nginx worker进程PID ``` **特点**: - 直接返回精确匹配的PID[^1] - 适用于服务进程(如nginx/redis) - 多个实例返回多个PID --- #### 📊 方案2:使用`pgrep`命令(功能更强) **命令格式**: ```bash pgrep -f "<进程名或命令行关键词>" ``` **示例**: ```bash $ pgrep -f "python app.py" # 匹配完整命令行 5678 $ pgrep -x chrome # 精确匹配进程名 1234 5678 ``` **特点**: - `-f`支持模糊匹配命令行 - `-x`要求进程名精确匹配[^2] - `-l`同时显示进程名 --- #### 方案3:使用`ps`+管道(灵活过滤) **命令格式**: ```bash ps aux | grep '<进程名>' | grep -v grep | awk '{print $2}' ``` **示例**: ```bash $ ps aux | grep 'node' | grep -v grep | awk '{print $2}' 3345 5567 ``` **分解说明**: 1. `ps aux`:列出所有进程 2. `grep 'node'`:过滤包含"node"的行 3. `grep -v grep`:排除grep自身进程 4. `awk '{print $2}'`:提取第二列(PID) --- #### 📋 方案4:通过`/proc`目录查找(底层方法) **命令格式**: ```bash ls -l /proc/*/exe 2>/dev/null | grep '<进程名>' | awk -F'/' '{print $3}' ``` **示例**: ```bash $ ls -l /proc/*/exe 2>/dev/null | grep 'java' | awk -F'/' '{print $3}' 7789 ``` **原理**: 遍历`/proc/[pid]/exe`符号链接指向的可执行文件路径 --- ### 📌 方法对比表 | 方法 | 优点 | 缺点 | 适用场景 | |---------------|--------------------------|-----------------------|-------------------| | `pidof` | 简单直接,结果最干净 | 无法模糊匹配 | 标准服务进程 | | `pgrep` | 支持正则和命令行匹配 | 语法稍复杂 | 需精确过滤的场景 | | `ps+管道` | 兼容性最好 | 需排除grep自身 | 老版本系统 | | `/proc`遍历 | 不依赖外部命令 | 效率较低 | 特殊调试场景 | --- ### ⚠️ 注意事项 1. **权限要求**:普通用户只能查看自己启动的进程,需`sudo`查看系统进程 2. **僵尸进程**:上述方法无法显示状态为`Z`的僵尸进程 3. **多实例处理**: ```bash # 获取所有Java进程PID pgrep -x java | while read pid; do echo "PID $pid: $(ps -p $pid -o cmd=)" done ``` --- ### 🌰 实用示例脚本 ```bash #!/bin/bash if [ $# -eq 0 ]; then echo "Usage: $0 <process_name>" exit 1 fi # 尝试三种方法获取PID found=0 for method in pidof pgrep "ps+grep"; do case $method in pidof) pids=$(pidof "$1") ;; pgrep) pids=$(pgrep -x "$1") ;; "ps+grep") pids=$(ps aux | grep "$1" | grep -v grep | awk '{print $2}' | tr '\n' ' ') ;; esac [ -n "$pids" ] && { echo "通过 ${method^^} 找到 $1 的PIDs: $pids" found=1 } done [ $found -eq 0 ] && echo "未找到 $1 的进程" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值