Как запустить команду в фоновом режиме с задержкой?

33

Может кто-нибудь показать мне, как сделать программу для этого действия: через 5 минут

echo "80" > /sys/class/leds/blue/brightness

Я хочу, чтобы эта программа работала в фоновом режиме (например, rngdслужба), я не могу этого сделать, потому что я не так много знаю о Linux.

user53337
источник

Ответы:

51
( 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 секунд, чтобы остановить его. В противном случае перезагрузка будет быстрой, без задержки.

Научная фантастика
источник
Да, я согласен, но это также может быть частью размышления пользователя ;-)
Kiwy
Другие ответы, кажется, пропускают часть «на заднем плане». Нет, я был довольно откровенен об этом: /
Златовласка
@goldilocks: Вы добавили отправку в фоновую часть только после того, как я опубликовал свой ответ.
SF.
Нет, мой первоначальный ответ состоял в том, чтобы запустить функцию, содержащую сон, &для фона сна; «Вы также должны фоновый сон» было в первой строке с самого начала. Если вы мне не верите, посмотрите историю изменений. И мой ответ на 5 минут старше твоего: P
златовласка
1
@gekannt: ... эээ, вопрос "Как запустить команду в фоновом режиме с задержкой?" - Как бы вы достигли этого в противном случае? (и нет, если вы не создадите фоновую ()группу, исходная оболочка будет приостановлена ​​до тех пор, пока не будет создан новый.)
SF.
11

используйте atкоманду

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

это будет работать в фоновом режиме

exussum
источник
2
Это правильный способ сделать это, но для этого нужен демон atd, и на большинстве систем должен быть установлен пакет.
Джулиан
Вы можете использовать одинарные кавычки, чтобы избежать побега, и echoвообще отказаться от использования heredoc или herestring.
Крис Даун
@Julian, atэто стандартная команда POSIX. Какая Unix-подобная система не имеет ее по умолчанию?
Стефан Шазелас
1
@ StéphaneChazelas - хороший вопрос. я знаю, у меня была эта проблема, но это было некоторое время назад. Я сделал небольшую проверку, и команда at кажется довольно вездесущей. Также кажется, что atd специфичен для Linux и даже в некоторых системах Linux может быть заменен демоном cron в стиле BSD. Давайте посчитаем мой комментарий устаревшим.
Джулиан
Я попробовал 'at', и на Android 8 не было найдено ни одной команды
beppe9000
6

Если вы хотите, чтобы что-то запустилось за 5 минут, а остальная часть вашей программы продолжилась (или завершилась), вам также необходимо установить фоновый режим сна:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

Это напечатает, helloа затем через 3 секунды (после выхода из основной программы), печать world.

Важная часть состоит в том, &чтобы раскошелиться на выполнение функции в фоновом режиме.

лютик золотистый
источник
1
Могу ли я предложить runWithDelay () { sleep $1; "${@:2}"; }вместо этого?
manatwork
1
Я думаю, это следует прочитать doWhateverWithDelay 3 &в вашем втором примере.
Baarn
@ Manatwork: Ура.
Златовласка
1
@goldilocks, главное в использовании $@это то, что вы можете цитировать его и будет расширен как список цитируемых слов. Так что лучше сделайте это "$@"(или, "${@}"если вам нравятся брекеты). См pastebin.com/MU7hbB2C
manatwork
@manatwork: Точка занята;) Я попробовал это, используя args с echo ( -n), но, очевидно, это было немного наивно.
Златовласка