1

我一直在寻找一种方法来正确和干净地启动一系列通过管道传输的二进制文件,并让所有的东西像一系列守护进程一样正常启动......但没有运气。

简而言之,这是我的命令:

ossrecord -s48000 -b16 -c2 -d/dev/oss/oss_envy24ht0/pcmin0 - | opusenc --bitrate 96 - - | oggfwd 192.168.1.12 7000 mysecret /mystream.opus

基本上,它从捕获设备中获取 oss v4 pcm 音频,将输出 aout 传输到 opusenc 二进制文件,然后将其编码为 opus 格式,最后,我将结果通过管道传输到 icecast2 服务器(所有这些或多或少都有很好的记录on the opus docs)而且效果很好!

问题是所有这些都发生在 cli 上,它捕获标准输出并开始输出。作为所有这些东西,我无法控制一系列管道进程。此外,最好有某种启动/停止脚本,这样就可以让所有这些都在后台运行。

我像往常一样一直在与 start-stop-daemon 作斗争,但我的知识基本上涵盖了处理单个二进制文件及其参数(如 docs 中所示),我认为我在盲目地踩着神圣大师的领域。

所以,也许有人可能会发现这可以完全或部分完成。

4

1 回答 1

2

我遇到了完全相同的问题,并决定让我永远解决这个问题;-) [一个原因是你在stackoverflow上的问题没有答案甚至没有评论。]

因此,我编写了一个名为pipeexec的小程序。一言以蔽之,特点:

  1. 启动程序并将它们连接在一起。
  2. 当 a SIGTERM, SIGINTorSIGQUIT被发送到程序时,它会终止它的所有孩子,然后终止它自己。
  3. 当 aSIGHUP被发送到pipexec时,它会重新启动所有子节点(包括它们之间的管道)。
  4. 当一个子进程非正常终止时(例如通过信号),所有子进程都会终止并重新启动(包括管道)。
  5. 支持pid文件。

它是用纯 C99 编写的,并考虑了 Linux。500 行代码导致大约 20k 可执行文件。我使用and集成pipexec到 RHEL6 中,它可以无缝工作。这里使用了 pid 文件功能。/etc/init.d/functions daemonkillproc

亲切的问候 - 安德烈亚斯

于 2014-03-17T19:42:37.217 回答