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 秒钟,然后将其杀死。
&在第二行之后添加以放置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。
祝你好运