【问题标题】:Get PID of process in one line一行获取进程的PID
【发布时间】:2018-05-30 19:08:07
【问题描述】:

我有一个由电话系统调用的 bash 脚本,它从 URL 获取一些音频,然后(使用 ffmpeg、mplayer 等)将其通过管道传回应用程序。该文件可以有多个被调用的 URL,因此如果第一个说离线或给出 404,它将转到下一行。

我有一个问题,有时服务器会生成内容但没有音频。在这种情况下,我想杀死 ffmpeg、mplayer 等的当前 PID,以便脚本继续运行。

我无法将它放在前台并获取最后一个 PID,因为一旦它在前台运行,媒体就不再通过管道传输到调用它的应用程序。我不能在开始时使用 exec ,因为如果我随后向 PID 发出终止命令,那么脚本就会死掉,这是我不想要的。

脚本如下所示:

#!/bin/bash

/usr/bin/ffmpeg  -i 'http://1.1.1.1/soft_music' -vn -ar 8000 -ac 1 -f s16le -
/usr/bin/ffmpeg  -i 'http://2.2.2.2/soft_music' -vn -ar 8000 -ac 1 -f s16le -

我假设我需要添加一些东西来记录当前运行的 ffmpeg 命令的 pid,以便我的外部脚本可以获取它并杀死它。完成后,它将转到下一行并尝试来自 2.2.2.2 的下一个流

【问题讨论】:

标签: linux bash ffmpeg


【解决方案1】:

下面的脚本似乎可以满足我的要求:

#!/bin/bash

/usr/bin/ffmpeg  -i 'http://1.1.1.1/soft_music' -vn -ar 8000 -ac 1 -f s16le - & echo $! > /tmp/my_pid
%1
/usr/bin/ffmpeg  -i 'http://2.2.2.2/soft_music' -vn -ar 8000 -ac 1 -f s16le - & echo $! > /tmp/my_pid
%1

它的作用是将 ffmpeg 进程置于后台仅片刻以将 PID 存储在文件中。只要它进入下一行,我们就会使用作业 ID 将其恢复为 1。

【讨论】:

  • 脚本中的作业控制不是必要也不在这里是否合适:stackoverflow.com/questions/690266/…。只需将 pid 保存到变量中,或者更好的是,同步运行命令并验证命令的标准输出并在有效时退出。 (问题不清楚)
猜你喜欢
  • 2011-05-20
  • 2021-08-08
  • 2016-01-31
  • 2011-07-11
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多