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

Ste*_*veC 7 command-line bash timeout killall

我有兴趣运行一个 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
Run Code Online (Sandbox Code Playgroud)

它不仅不会停止流录制,而且在我点击Ctrl+后,该应用程序有时似乎会冻结Z

任何建议表示赞赏。

Bea*_*nog 14

您可以使用该timeout命令来运行有时间限制的命令。它的基本语法是:

timeout DURATION COMMAND
Run Code Online (Sandbox Code Playgroud)

whereDURATION是一个浮点数,后缀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}"
Run Code Online (Sandbox Code Playgroud)

运行您的命令 10 秒钟,然后将其杀死。

  • `timeout 10s` 将节省 `sleep 10` 调用和 `killall vlc` 以及在命令后添加 `&` 的需要。+1为此:) (2认同)

Raf*_*ffa 7

&在第二行之后添加以放置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
Run Code Online (Sandbox Code Playgroud)

它会起作用。


说明:

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
Run Code Online (Sandbox Code Playgroud)

nohup.out如果可能,这会将输出附加到当前工作目录中调用的文件中,~/nohup.out否则将允许脚本干净、完全地终止。

有关信息,请参阅man nohup

祝你好运