Я использую livestreamer и ffmpeg для захвата изображений из прямой трансляции со скоростью 0,1 кадра в секунду:

livestreamer --player "ffmpeg -i" --player-args "{filename} -vf fps=1/10 out%04d.png" https://www.ustream.tv/channel/number worst

Я не мог заставить ffmpeg перезаписать свой вывод, поэтому он продолжает создавать новые файлы с шаблоном out%04d.png . Это нормально, я могу следить за самым новым файлом и удалять старые. Однако процесс livestreamer иногда завершается по разным причинам, и я хотел бы перезапустить его автоматически, если я хочу его запустить.

Попытка использовать подоболочку не отреагировала на CTRL-C, как я ожидал, потому что сигнал не передается по подоболочке:

#!/bin/bash

( while true; do
  livestreamer --player "ffmpeg -i" --player-args "{filename} -vf fps=0.1 out%04d.png" https://www.ustream.tv/channel/number worst
done ) &

while true; do
  newestImage=${code to find newest image}
  postProcess $newestImage
  deleteOldImages
  sleep 5
done

Когда я отправляю SIGINT вышеприведенному сценарию, подоболочка остается активной, даже когда я закрываю оболочку, в которой я запускала родительский сценарий. Выходной каталог заполнен новыми файлами, а код, который должен их удалить, больше не работает. trap тоже не помогла:

trap "kill $SUBSHELL_PID" SIGINT

( ... ) & # subshell as above
SUBSHELL_PID=&!

С этим я даже не смог прервать родительский сценарий. Очевидно, я совсем не разбираюсь в обработке сигналов в bash, поэтому я рад любому совету, который поможет мне двигаться вперед. Мне нужно перезапустить фрейм-граббер, пока работает родительский скрипт, и следить за старыми файлами, чтобы удалить их.

Редактировать: Может ли подоболочка быть плохой идеей? Могу ли я как-нибудь запустить livestreamer в фоновом режиме и либо убить его, когда захочу, либо перезапустить, когда он сам выйдет?

1 ответ1

1

Убей самого livestreamer.

trap "killall livestreamer" SIGINT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .