Ответы:
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
Таким образом, ваш сценарий продолжается, или вы немедленно восстанавливаете управление, пока запускается новая фоновая задача сценария, с двумя командами: sleep и echo.
Распространенная ошибка пытается дать либо sleep
или echo
или оба , &
которые не будут работать должным образом . Запуск ряда команд, ()
хотя и порождает их в отдельном процессе оболочки, который затем можно отправить целиком в фоновый режим &
.
Для того остроумия, где я нашел это активно полезным. Во встроенном устройстве, которое я разрабатываю, есть основное приложение, которое работает со сторожевым таймером. Если сбой происходит таким образом, что запускает сброс сторожевого таймера вскоре после запуска, то его трудно исправить удаленно, так как период между запуском ОС и сбросом довольно короткий, его недостаточно для ssh-входа и блокировки запуска приложения. Поэтому мне нужен способ определить, что система перезапускается так быстро, и ввести задержку, если она есть, чтобы дать мне время исправить это вручную.
[ -f /tmp/startdelay ] && sleep 30
touch /tmp/startdelay
( sleep 30 ; rm /tmp/startdelay ) &
[ -f /tmp/noautostart ] && exit 0
start_app
Если я войду в систему и выполню touch /tmp/noautostart
основное приложение, оно не запустится. Если сторожевой таймер rm /tmp/startdelay
включится, не будет выполнен, и при следующем запуске системы, это даст мне дополнительные 30 секунд, чтобы остановить его. В противном случае перезагрузка будет быстрой, без задержки.
&
для фона сна; «Вы также должны фоновый сон» было в первой строке с самого начала. Если вы мне не верите, посмотрите историю изменений. И мой ответ на 5 минут старше твоего: P
()
группу, исходная оболочка будет приостановлена до тех пор, пока не будет создан новый.)
используйте at
команду
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
это будет работать в фоновом режиме
echo
вообще отказаться от использования heredoc или herestring.
at
это стандартная команда POSIX. Какая Unix-подобная система не имеет ее по умолчанию?
Если вы хотите, чтобы что-то запустилось за 5 минут, а остальная часть вашей программы продолжилась (или завершилась), вам также необходимо установить фоновый режим сна:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
Это напечатает, hello
а затем через 3 секунды (после выхода из основной программы), печать world
.
Важная часть состоит в том, &
чтобы раскошелиться на выполнение функции в фоновом режиме.
runWithDelay () { sleep $1; "${@:2}"; }
вместо этого?
doWhateverWithDelay 3 &
в вашем втором примере.
$@
это то, что вы можете цитировать его и будет расширен как список цитируемых слов. Так что лучше сделайте это "$@"
(или, "${@}"
если вам нравятся брекеты). См pastebin.com/MU7hbB2C
-n
), но, очевидно, это было немного наивно.