You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:05:43