You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动