Linux根据进程名称获取pid的方法

以下通过两种方法来根据进程名称获取pid

 

方法一

最简单的方法是使用 pidof 命令

用法:pidof  process_name

 

示例

官网的详细用法如下:

NAME
       pidof -- find the process ID of a running program.

SYNOPSIS
       pidof [-s] [-c] [-n] [-x] [-m] [-o omitpid[,omitpid..]]  [-o omitpid[,omitpid..]..]  program [program..]

DESCRIPTION
       Pidof finds the process id's (pids) of the named programs. It prints those id's on the standard output. This program is on some systems used in run-level change scripts, especially when
       the system has a System-V like rc structure. In that case these scripts are lo
<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 的进程" ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值