Остановить приложение в 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 .

Любые предложения приветствуются.

5
задан 11 April 2020 в 20:54

4 ответа

Можно использовать 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 секунд и затем уничтожить его.

11
ответ дан 25 April 2020 в 10:51

Это - вероятно, самый изящный ответ (только работы с 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.

3
ответ дан 25 April 2020 в 10:51

Добавить & после второй строки для помещения 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

и это будет работать.


Explaination:

Оболочка/терминал выполнит команды в порядке, они перечислены в сценарии и переместятся в следующую команду, только если команда, прежде чем это закончит выполняться.

Который не имеет место в Вашем VLC команда. Пока VLC работает, оболочка/терминал будет считать это все еще выполнением и не переместится в команду после него, но будет скорее ожидать его, чтобы закончить выполняться (т.е. в этом случае, закрывающемся VLC окно/экземпляр).

Обходное решение это должно отправить VLC к фону и освобождают подсказку оболочки/терминала для следующей команды в сценарии. Который может быть сделан путем добавления & после команды.


Уведомление:

  • Удалите опцию многословия -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 для получения информации.

Всего наилучшего

7
ответ дан 25 April 2020 в 10:51

Я вполне уверен, которым этот вопрос будет найден людьми, желающими остановить другие программы, не просто vlc в системах, которые не имеют timeout команда, таким образом, в расширении уже хорошего универсального ответа Raffa:

Ваша попытка уничтожила бы все vlc процессы в системе, не только тот, запущенный этим сценарием. Вместо этого можно использовать kill встроенный, поскольку это может принять спецификацию задания удара. Например:

#!/usr/bin/bash
vlc -vvv http://… &
sleep 10
kill %?vlc

& оператор во второй строке создаст фоновое задание удара. Затем kill %?vlc уничтожит задание удара, префикс которого vlc.

1
ответ дан 25 April 2020 в 10:51

Другие вопросы по тегам:

Похожие вопросы: