Запустить команду через определенный промежуток времени?

Если я выполняю длительный процесс, можно ли каким-либо образом выполнить некоторые команды, основанные на времени?

Например, я выполняю очень длительный процесс, который длится около 10 минут.

Через 5 минут я хотел бы запустить отдельную команду. Для иллюстрации отдельная команда может быть: echo 5 minutes complete

(Примечание: я не хочу прогресса в завершении команды, а просто команд, выполняемых через определенные интервалы.)

Является ли это возможным?

Просто беги:

 long-command & sleep 300; do-this-after-five-minutes 

Через do-this-after-five-minutes выйдет через 5 минут. long-command будут работать в фоновом режиме.

Вы можете использовать этот скрипт:

 #!/bin/bash TEMPFILE="$(mktemp)" STARTTIME="$(date +%s)" (./longprocess; rm -f "$TEMPFILE") & while [ -f "$TEMPFILE" ]; do sleep 1s NOW="$(date +%s)" if (( (NOW-STARTTIME) % 300 == 0 )); then echo "$(( (NOW-STARTTIME)/60 )) minute(s) elapsed" fi done echo "Done!!!" 

Он выполняет ваш longprocess в sub-shell и затем контролирует ранее созданный файл «lock» для существования.

Для этого есть один лайнер:

 ( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND ) 

В вашем случае TIMEOUT = 5m и COMMAND – это длинная команда.

Также см. Мой ответ на это сообщение « Тайм-аут» с «перезагрузкой сетевой сети»

 #! /bin/bash ( sleep 4 ) & # <-- The long running process. seconds=1 while jobs %1 &>/dev/null ; do echo $((seconds++)) seconds complete sleep 1 done echo Done. 

jobs %1 завершается с ошибкой после остановки задания% 1.

Обратите внимание, что в течение более длительного времени, $ секунд может выйти из синхронизации с реальным временем. Лучше сохранить время начала и вычислить разницу с фактическим временем.