Ubuntu/PHP环境下进程PID设置与获取技术咨询
关于进程PID的设置与获取问题
1. 能否手动设置PID?
不行哦,进程的PID是由操作系统内核自动分配的,用户没办法手动指定。内核需要维护进程表,确保每个PID唯一且不冲突,所以手动设置PID的操作是不被允许的——这属于内核的权限范围。
2. 如何获取最后启动进程的PID?
你遇到的pgrep ffmpeg返回多个PID的问题,是因为每次执行ffmpeg命令都会启动一个新的进程,所以pgrep会列出所有正在运行的ffmpeg进程,而不是你刚启动的那一个。这里有两种可靠的解决方式:
方式一:启动时直接捕获PID(推荐)
你当前命令里的echo $!其实是正确的获取当前启动的后台进程PID的方法,只需要在执行命令时直接把这个值捕获到变量或文件里,而不是事后再用pgrep查找:
# 替换为你的实际流地址和RTMP地址 streamurl="your_stream_url" rtmp="your_rtmp_url" command="ffmpeg -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 2000 -i $streamurl -c:v copy -c:a aac -ar 44100 -ab 128k -ac 2 -strict -2 -f flv $rtmp > /dev/null 2>&1 & echo \$!" # 执行命令并捕获当前启动的PID procid=$(eval "$command") echo "本次启动的ffmpeg进程PID为:$procid"
这样每次启动ffmpeg时,procid变量里就会存储当前这个进程的PID,不会和其他ffmpeg进程混淆。
方式二:事后查找最新启动的ffmpeg进程
如果确实需要在事后获取最后启动的ffmpeg进程PID,可以用ps命令结合排序来实现:
# 按启动时间倒序排列ffmpeg进程,取第一个PID(最新启动的) latest_pid=$(ps -eo pid,lstart,cmd | grep ffmpeg | grep -v grep | sort -k 2,3r | awk '{print $1}' | head -n1) echo "最后启动的ffmpeg进程PID为:$latest_pid"
这个命令的逻辑拆解:
ps -eo pid,lstart,cmd:输出所有进程的PID、启动时间和完整命令行grep ffmpeg | grep -v grep:过滤出ffmpeg进程,同时排除grep自身的进程sort -k 2,3r:按启动时间(第二、三列)倒序排序,最新启动的排在最前面awk '{print $1}' | head -n1:提取第一列的PID,并只保留第一个结果
为什么你的pgrep ffmpeg会返回多个PID?
因为每次执行你的ffmpeg命令,都会启动一个独立的后台进程。如果没有先终止之前的ffmpeg进程,多次执行后系统里就会存在多个ffmpeg进程,pgrep会把所有匹配的PID都列出来,所以你会看到多个结果。
内容的提问来源于stack exchange,提问作者Mahmoud Khatib




