在一定时间后停止 bash 中的应用程序

在一定时间后停止 bash 中的应用程序

我感兴趣的是运行一个 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 1010 秒后停止播放 播放
--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

相关内容