我感兴趣的是运行一个 bash 脚本,该脚本启动一个应用程序(在本例中为 VLC),运行一段时间,然后停止它。我可以使用以下脚本让此应用程序正常启动,但它不会停止:
#!/usr/bin/bash
vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}"
sleep 10
killall vlc
它不仅没有停止流记录,而且在我按下Ctrl+之后应用程序似乎有时会冻结Z。
任何建议都值得赞赏。
答案1
您可以使用timeout
命令运行带有时间限制的命令。其基本语法是:
timeout DURATION COMMAND
其中DURATION
是一个浮点数,带有s
秒、m
分钟、h
小时或d
天的后缀,并且COMMAND
是您希望运行的命令。
对于您来说,可以使用:
timeout 10s vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}"
运行你的命令 10 秒然后将其终止。
答案2
&
在第二行之后添加以VLC
放入背景,如下所示:
#!/usr/bin/bash
vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}" &
sleep 10
killall vlc
并且它会起作用。
解释:
shell/终端将按照脚本中列出的顺序执行命令,并且只有当其之前的命令执行完成后才会移动到下一个命令。
您的命令并非如此VLC
。只要VLC
正在运行,shell/终端就会认为它仍在执行,并且不会移动到它之后的命令,而是等待它完成执行(即在本例中关闭窗口VLC
/实例)。
一个解决方法是将其发送VLC
到后台并释放 shell/终端提示符以执行脚本中的下一个命令。这可以通过&
在命令后添加来完成。
注意:
删除详细程度选项
-vvv
以避免脚本不能干净完整地退出。但是,如果您必须使用详细程度选项,则也在第二行之前
-vvv
添加,如下所示:nohup
#!/usr/bin/bash
nohup vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}" &
sleep 10
killall vlc
nohup.out
如果可能的话,这会将输出附加到当前工作目录中调用的文件中,否则~/nohup.out
将允许脚本干净、完全地终止。
看男子nohup了解详情。
祝你好运
答案3
这可能是最优雅的答案(当然只适用于 VLC):
#!/usr/bin/bash
vlc -vvv --stop-time 10 --play-and-exit http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}"
--stop-time 10
10 秒后停止播放 播放
--play-and-exit
停止后将退出 VLC(默认为--no-play-and-exit
)
在某些情况下您需要使用--run-time
而不是--stop-time
。
答案4
我很确定想要停止其他程序的人会发现这个问题,而不仅仅是vlc
在没有该timeout
命令的系统上,因此,对于 Raffa 已经很好的通用答案的扩展:
您的尝试将终止vlc
系统中的所有进程,而不仅仅是此脚本启动的进程。相反,您可以使用kill
内置脚本,因为它可以接受 bash 作业规范。例如:
#!/usr/bin/bash
vlc -vvv http://… &
sleep 10
kill %?vlc
第二行中的运算符&
将创建背景bash 作业。然后kill %?vlc
将杀死bash 作业其前缀为vlc
。