Предполагая, что оболочка подобна bash
или ksh
:
max_time=3
SECONDS=0
IFS=$'\n:'
grep -v '^#' ref.txt |
while read tag cmd; do
if (( SECONDS < max_time )); then
echo "starting '$cmd' (tag is '$tag')"
sleep 2 # for simulation purposes
else
echo "did not have time to start '$cmd' (tag is '$tag')"
fi
done
Это даст следующий результат:
$ ksh script.sh
starting 'Process3' (tag is 'TEST')
starting 'process4' (tag is 'TEST')
did not have time to start 'process5' (tag is 'TEST')
Сценарий выбирает все строки из файла ref.txt
, которые не закомментированы, и разбивает их на :
, чтобы отделить начальный тег от команды.
Если время ожидания сценария еще не истекло, он запускает текущий процесс чтения (здесь имитируется вызовом sleep
).
Если он использовал слишком много времени, он не будет запускать другие процессы, но сообщит о тех, которые еще не были запущены.
Тайм-аут не произойдет асинхронно, т.е. скрипт не прервет запуск процесса, если прошло более max_time
секунд.
Переменная SECONDS
содержит количество секунд с момента запуска оболочки или, как в данном случае, с момента последнего сброса в ноль.