html - 生成守护进程的 CGI Bash 脚本

标签 html apache bash cgi daemon

我正在从事一个项目,将 HDTV 从个人电脑流式传输到支持 HTTP 实时流式传输的设备(想想 iOS 设备和一些安卓设备)。我有视频的格式和流媒体方面的问题。我现在尝试实现的是一种远程更改 channel 的简单方法。

我目前的方法是通过 SSH 连接以终止旧流并开始新流。这有效,但并不漂亮。我想要我妈妈或女朋友可以使用的东西。我决定构建一个 HTML5 应用程序,通过 CGI 脚本发布 channel 切换。我目前有一个父进程,其表单调用子进程来确定流是否正在运行,然后调用子进程来实际调整流。

当我从我的计算机流式传输实时视频时,我需要子进程无限期地运行。 不幸的是,当我的父进程完成时,子进程中启动的后台进程似乎终止了。

我尝试了一个简单的 &,使用 nohup、setsid 和守护进程。守护进程运行最干净,但仍会在父进程完成时终止。即使有 -r 标志。我将把我的代码放在下面,也许有人会对我如何实现这个或实现相同目标的更好方法有想法?谢谢! (哦,我知道杀死 vlc 并不是杀死流的好方法,如果你有更好的方法我洗耳恭听)

parent invoking child:
----------------------
./ChangeChannel.sh $channel     #passed from form submission


child (ChangeChannel.sh):
-------------------------
#!/bin/bash

directory=./Channels/
newchannel=$1

if [ $(pidof vlc) ]
    then
        sudo kill $(pidof vlc)
fi
daemon -r -v -d $directory$newchannel &


subchild example:
-----------------
vlc atsc://frequency=605029000 --intf=dummy --sout-transcode-audio-sync :live-cache=3000 --sout='#transcode{vcodec=h264,vb=150,fps=25,width=480,scale=1,venc=x264{aud,profile=baseline,level=30,keyint=15,bframes=0,ref=1},acodec=aac,ab=40,channels=2,samplerate=22050}:duplicate{dst=std{mux=ts,dst=-,access=livehttp{seglen=16,delsegs=true,numsegs=10,index=/var/www/stream/live.m3u8,index-url=content/live-######.ts},mux=ts{use-key-frames},dst=/var/www/stream/content/live-######.ts,ratecontrol=true}}'

我怎样才能防止子进程终止???在 Ubuntu 12.04 上运行 Apache

最佳答案

我明白了!

对于任何对如何操作感兴趣的人,我改变了策略以使用 nohup、&、disown 和 >/dev/null 2>&1。

老实说,我仍然不太确定我是如何让它工作的……只是通过一些有根据的猜测进行了大量的试验和错误。我的代码如下:

parent invocation:
------------------
nohup ./ChangeChannel.sh $channel & disown


child invocation:
-----------------
sudo nohup su user $directory$newchannel &> /dev/null 2>&1


subchild invocation:
--------------------
vlc atsc://frequency=605029000 --intf=dummy --sout-transcode-audio-sync :live-cache=3000 --sout='#transcode{vcodec=h264,vb=150,fps=25,width=480,scale=1,venc=x264{aud,profile=baseline,level=30,keyint=15,bframes=0,ref=1},acodec=aac,ab=40,channels=2,samplerate=22050}:duplicate{dst=std{mux=ts,dst=-,access=livehttp{seglen=16,delsegs=true,numsegs=10,index=/var/www/stream/live.m3u8,index-url=content/live-######.ts},mux=ts{use-key-frames},dst=/var/www/stream/content/live-######.ts,ratecontrol=true}}' & disown

ChangeChannel.sh 使用 sudo 通过 cgi 执行 su,以便以 root 以外的用户身份执行 vlc。看起来有点乱,但它确实有效。

关于html - 生成守护进程的 CGI Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12156452/

相关文章:

linux - 在 Bash/Linux 中将日期、时间、文件计数和文件名写入文件

Python 找不到它的包

video - HTML5 视频 : Force abort of buffering

jQuery 弹跳效果与 css 样式问题

html - 如何确定带有微数据的 anchor 标签的值(value)?

php - 为什么我的 .htaccess 文件在 cPanel 中无法工作?

linux - apache 用户不存在

html - 如何创建小于元素宽度的居中圆形阴影?

mysql - XAMPP 内的 Apache 和 MySQL 无法启动

linux - 如何根据正则表达式模式将流拆分为 stdout+stderr?