Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Ограничение времени на исполнение программы

#linux #bash


Есть вот такой скрипт:

#! /bin/bash

while true; do
   camscr=(
      'ffmpeg -i rtmp://127.0.0.1/live/cam1 /web/www/preview/cam1.jpeg -y'
      'ffmpeg -i rtmp://127.0.0.1/live/cam2 /web/www/preview/cam2.jpeg -y'
      'ffmpeg -i rtmp://127.0.0.1/live/cam3 /web/www/preview/cam3.jpeg -y'
      )

   camcnt=0

   until [ $camcnt = ${#camscr[@]} ]
      do
         ${camscr[$camcnt]}
         (( camcnt++ ))
         sleep 15
      done
done


Для ${camscr[$camcnt]} нужно сделать ограничение по времени работы на случай если
ffmpeg повиснет. Кроме этих ffmpeg крутятся еще несколько десятков ffmpeg, поэтому
убить все сразу их нельзя.

Я хочу поочередно запускать эти процессы либо до успешного завершения, либо с принудительным
завершением через 10-15 секунд с поочередным интервалом в 15 секунд.
    


Ответы

Ответ 1



можно обойтись без счётчика, перебирая непосредственно элементы массива: for cam in "${camscr[@]}"; do $cam done можно во вложенном цикле запустить сразу все процессы (используя оператор &), а после цикла, подождав нужное количество секунд, «убить» все дочерние процессы: for cam in "${camscr[@]}"; do $cam & done sleep интервал pkill -P $$ пояснения: программа pkill обычно устанавливается вместе с базовой системой (в debian gnu/linux и дистрибутивах-наследниках эта программа входит в пакет procps). опция -P идентификатор указывает «послать сигнал всем дочерним процессам процесса с данным идентификатором». по умолчанию посылается сигнал SIGTERM, другой сигнал можно задать с помощью опции -имя_или_номер (или --signal имя_или_номер), например -9 или -KILL или --signal 9. $$ — в posix-совместимых оболочках эта переменная содержит идентификатор текущего процесса (т.е. процесса, выполняющего данный скрипт).

Ответ 2



$ timeout --help Usage: timeout [OPTION] DURATION COMMAND [ARG]... or: timeout [OPTION] Start COMMAND, and kill it if still running after DURATION. Mandatory arguments to long options are mandatory for short options too. --preserve-status exit with the same status as COMMAND, even when the command times out --foreground when not running timeout directly from a shell prompt, allow COMMAND to read from the TTY and get TTY signals; in this mode, children of COMMAND will not be timed out -k, --kill-after=DURATION also send a KILL signal if COMMAND is still running this long after the initial signal was sent -s, --signal=SIGNAL specify the signal to be sent on timeout; SIGNAL may be a name like 'HUP' or a number; see 'kill -l' for a list of signals --help display this help and exit --version output version information and exit DURATION is a floating point number with an optional suffix: 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. If the command times out, and --preserve-status is not set, then exit with status 124. Otherwise, exit with the status of COMMAND. If no signal is specified, send the TERM signal upon timeout. The TERM signal kills any process that does not block or catch that signal. It may be necessary to use the KILL (9) signal, since this signal cannot be caught, in which case the exit status is 128+9 rather than 124. GNU coreutils online help: Full documentation at: or available locally via: info '(coreutils) timeout invocation'

Комментариев нет:

Отправить комментарий