Ubuntu下sudo提权后如何从脚本获取调用服务的进程ID
获取原服务进程ID的解决方案
因为sudo启动进程时会创建独立的子进程,导致脚本XY的$$是自身PID,$PPID是sudo的PID,而非原服务的PID。以下是几种可行的解决办法:
1. 直接传递PID参数(推荐)
修改原服务中调用sudo的命令,把自身PID作为参数传给XY脚本:
# 原服务中执行的sudo命令 sudo /path/to/XY.sh $PPID
在XY.sh里直接读取第一个参数即可拿到原服务PID:
ORIGINAL_SERVICE_PID=$1 # 后续使用这个变量 echo "原服务进程ID: $ORIGINAL_SERVICE_PID"
2. 追踪进程父链
如果无法修改原服务的调用逻辑,可以通过ps命令回溯sudo的父进程:
# 获取当前脚本的父进程(即sudo的PID) SUDO_PID=$PPID # 读取sudo的父进程ID,也就是原服务的PID ORIGINAL_SERVICE_PID=$(ps -o ppid= -p "$SUDO_PID" | sed 's/ //g') echo "原服务进程ID: $ORIGINAL_SERVICE_PID"
如果进程链更长,可以循环递归查找,直到找到目标服务的进程名或其他标识。
3. 环境变量传递
在原服务中设置环境变量,sudo时保留该变量(需注意安全):
原服务中执行:
export ORIGINAL_PID=$PPID # -E 参数保留环境变量 sudo -E /path/to/XY.sh
XY.sh中直接读取环境变量:
echo "原服务进程ID: $ORIGINAL_PID"
注意:使用-E会保留所有环境变量,可能有安全隐患,也可以在/etc/sudoers中单独配置允许传递ORIGINAL_PID变量。
内容的提问来源于stack exchange,提问作者Tomas Kubes
相关产品推荐
相关产品推荐

