Если я выполняю долгий процесс, могу ли я выполнить какие-то временные команды?
Например, я выполняю очень длинный процесс, который длится примерно 10 минут.
Через 5 минут я бы хотел запустить отдельную команду. Для иллюстрации, отдельная команда может быть:echo 5 minutes complete
(Примечание: я не хочу продвигаться к завершению команды, а просто к командам, выполняемым через указанные интервалы.)
Является ли это возможным?
shell-script
shell
delay
Аникет Бхаттачарья
источник
источник
longcommand & sleep 300 && command-to-do-after-five-minutes
? (На самом деле это, вероятно, то, что вы ищете.) Обратите внимание, что вашего разъяснения было недостаточно, так как вы сразу получили две реализации тактового индикатора выполнения.Ответы:
Просто беги:
do-this-after-five-minutes
Получит бежать через пять минут.long-command
Будет работать в фоновом режиме.источник
sleep 5m && foobar
, поэтому, если я передумаю и ^ C thesleep
, следующая команда не запустится.sleep 3; ls
и^C
, вторая команда все равно не запускалась. Не совсем уверен, почему и, возможно, он работает по-другому в неинтерактивной оболочке?sleep 5m && echo
спит, когда вы приостанавливаете, приостанавливается толькоsleep
команда. Остальная часть командной строки выполняется, но, поскольку онаsleep
была приостановлена, она не завершилась успешно, а часть после&&
пропускается. Попробуйте приостановитьsleep 5 || echo hello
, иhello
появляется сразу после нажатия^Z
.at(1)
, для таких вещей, какsleep 30m && mplayer something.mp3
напоминание о тревоге или дляsleep 90m && fg
возобновления команды, интенсивно использующей диск. Так что на самом деле,sleep 5m && echo hello
это хорошо, потому что^Z
приостанавливаетсяsleep
без выполнения следующей команды. Если вы хотите иметь возможность приостановить / возобновить всю составную команду, даже до выхода из спящего режима, используйте( sleep 2 && echo hello )
.&&
Идиома позволяет вам быть абсолютно уверенным, что вы не убьете процесс сразу после^Z
запуска сна (потому что вы можете не запускать команду, а не рисковать^C
). Это полезно в случае использованияsleep && fg
или вsleep && bg
случае, когда возобновляемая команда частично проходит через что-то медленное.Вы можете использовать этот скрипт:
Он выполняет ваши действия
longprocess
в,sub-shell
а затем отслеживает ранее созданный файл блокировки на существование.источник
man bash
дляSECONDS
. Вы можете установитьSECONDS=0
при запуске скрипта и только проверять на большее или равное 300 или устанавливатьSECONDS=$((date +%s))
и забытьdate
снова использовать в вашем скрипте ...sleep 1s
всегда быть ровно на одну секунду позже, чем было раньшеsleep 1s
... тогда вы стали жертвой Ложей, в которые программисты верят во времени . (Хотя в этом случае вы могли бы просто показать индикатор выполнения хеш-метки или что-то в этом роде.)sleep
!SECONDS
! :)Для этого есть один вкладыш:
В вашем случае TIMEOUT = 5 м, а COMMAND - длинная команда.
Также см. Мой ответ на это сообщение Тайм-аут с «перезагрузка сети службы»
источник
jobs %1
не удается после завершения задания% 1.Обратите внимание, что в течение более длительного времени $ секунд может не синхронизироваться с реальным временем. Лучше сохранить время начала и вычислить разницу с фактическим временем.
источник