2014-03-23 2 views
2

Я запускаю команду из терминала, которая проходит через каталог, проверяющий файлы мультимедиа, а затем извлекает данные с субтитрами из этих файлов. К сожалению, даже если нет закрытых данных субтитров, программа все еще обрабатывает весь файл, и это может занять много времени. То, что я хотел бы сделать, это проверить выход через 60 секунд и искать данные, а если файл пуст, завершите процесс и перейдите к следующему файлу.Shell Script: убить программу после установленного времени, если выходной файл пуст

Моя старая команда выглядит следующим образом

for i in */*.vob 
do 
    /home/me/ccextractor/linux/ccextractor -out=srt -utf8 -trim "$i" 
done 

Я экспериментировал с sleep, но я не могу заставить его работать. Какие-либо предложения?


РЕШЕНИЕ

С помощью ответов ниже (обратите внимание на комментарии, а), мой последний рабочий код:

for i in */*.vob 
do 
    /home/me/ccextractor/linux/ccextractor -out=srt -utf8 -trim "$i" & 
    pid=$! 
    sleep 15 
    srtfile=$(expr "${i}" | sed -r 's/.{4}$//') 
    fgrep -q "1" "${srtfile}.srt" || kill $pid 
    wait $pid 
done 
+0

Возможно, поиск 'timeout' вместо' sleep', см. [This] (http://stackoverflow.com/q/5161193/3076724). Кроме того, рассмотрите возможность повторного написания своего однострочного шрифта в качестве обычного сценария bash для улучшения читаемости вопроса. – BroSlow

+0

Спасибо BroSlow за предложения. Я также обновил форматирование, чтобы другие могли прочитать вопрос и решение в будущем. –

ответ

1

Предполагая, что ccextractor отлично работает в фоновом режиме (не требует ввода или tty), затем попробуйте:

for i in */*.vob 
do 
    /home/me/ccextractor/linux/ccextractor -out=srt -utf8 -trim "$i" & 
    pid=$! 
    sleep 60 
    [ -s "${i}_1" ] || kill $pid 
    wait $pid 
done 

, где я также принял решение в выходном файле, который ccextractor создает, имеет _1, добавленный к имени входного файла.

[ -s "${i}_1" ] проверяет, существует ли выходной файл и имеет размер больше нуля. Если это ложь, выполняется условие «или», и процесс уничтожается.

wait $pid заставляет оболочку ждать один ccextractor для выхода до начала другого. Если вы хотите запустить все параллельно, удалите эту строку.

+0

Это очень помогло! Огромное спасибо. Я не мог заставить '-s' работать по какой-то причине, поэтому я переключаю это и использую' fgrep' для поиска известного символа, который будет присутствовать, если этот файл заполняется. Мне также пришлось сделать небольшую работу, чтобы обеспечить правильный путь к файлу 'fgrep' (или' -s'), поскольку программа ccextractor заменяет существующее расширение новым. –

3

У вас может быть выход CCExtractor после обработки одной минуты видео, нет необходимости убивать процесс или контролировать его отдельно.

ccextractor -endat 1:00 [etc] 

будет делать то, что вы хотите.

+0

Спасибо за вход! Уловка, я не хочу, чтобы ccextractor прекратил работу, если были извлечены данные субтитров. Я просто хочу, чтобы он ушел, когда он обрабатывает файл, даже несмотря на отсутствие каких-либо субтитров. Вот почему мне нужно проверить и посмотреть, пустой ли файл srt или нет через определенное время. Если он не пуст, я разрешаю его продолжать, пока файл не будет выполнен. –

+0

jeffers.R вы можете обработать первую минуту, проверить размер сгенерированного файла и, если он отличен от нуля, обрабатывает файл полностью. – cfsmp3

Смежные вопросы