Я хочу выполнять команду каждые 10 секунд, и выполняется ли она в фоновом режиме (тем самым исключая watch
?). Все ответы показывают что-то вроде следующего, но это будет выполняться каждые 11-14 секунд. Как это можно сделать?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done
Ответы:
Как насчет:
ETA: Со всеми этими комментариями, альтернативами и вспомогательной оболочкой для дополнительной защиты это выглядит намного сложнее, чем казалось. Итак, для сравнения, вот как это выглядело до того, как я начал беспокоиться о
wait
илиkill
с их$!
потребностью в изоляции:Остальное действительно только тогда, когда вам это нужно.
источник
$!
: «Расширяется до идентификатора процесса задания, которое было недавно помещено в фон», иsleep
оно не помещается в фон, поэтому нет, не будет. :)Вы можете сделать что - то вроде следующего в
bash
,zsh
илиksh
:Вот что
bash
говорится в руководстве$SECONDS
:Вот рабочий пример:
источник
SECONDS
сделайтеsleep "$((10-(($SECONDS-$start_time)%10)))"
. Вам придется сделатьstart_time=$SECONDS
до цикла.SECONDS
. Создание суб-оболочки, как в вашем последнем редактировании, также должно избежать этой проблемы.while true
цикла, я не предполагал, что какое-либо состояние оболочки должно было его пережить. В любом случае, использование подобного цикла в собственном контексте обычно является наилучшей практикой. В такой ситуации я бы больше беспокоился о том, чтобы делать этоtrap
ради, а не$SECONDS
ради.Только BASH - вы также можете вычислить время, затраченное вашей командой, и вычесть из 10:
От BASH мужчина:
источник