Як запустити команду у фоновому режимі із запізненням?


33

Хтось може мені показати, як змусити програму зробити цю дію: через 5 хвилин

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

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

Відповіді:


51
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

Таким чином ваш сценарій продовжується, або ви відновите контроль негайно, тоді як починається нове фонове завдання сценарію з двома командами: сон та ехо.

Поширена помилка намагається дати або sleepабо echoабо обидва , &які не будуть працювати належним чином . Запуск серії команд, ()хоча породжує їх в окремому оболонковому процесі, який ви можете потім надіслати цілим у фоновий режим &.


На ту дотепність, де я вважаю це активно корисним. У вбудованому пристрої я розробляю основний додаток, який працює з сторожовою собакою. Якщо це не вдається у такий спосіб, що викликає скидання сторожової служби незабаром після запуску, повторно, важко це виправити віддалено, оскільки період між запуском ОС і скиданням досить короткий, недостатньо, щоб схуднути і заблокувати запуск програми. Тому мені потрібен спосіб визначити систему, яка перезапустилася настільки швидко, і ввести затримку, якщо вона була, щоб дати час виправити її вручну.

 [ -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

@goldilocks: Ви додали відправлення до фонової частини лише після того, як я опублікував свою відповідь.
СФ.

Ні, моя первісна відповідь полягала в тому, щоб запустити функцію, що містить сон, &щоб передати сон; "Ви також потребуєте заднього сну", - це було в першому рядку від початку. Якщо ви мені не вірите, подивіться історію редагування. І моя відповідь на 5 хвилин старша за твою: P
goldilocks

1
@gekannt: ... е, питання "Як запустити команду у фоновому режимі із запізненням?" - як би ви цього домоглися інакше? (і ні, якщо ви не працюєте з ()групою, оригінальна оболонка буде робити паузу до тих пір, поки породжена одна не закінчиться.)
SF.

11

використовувати atкоманду

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

що буде працювати у фоновому режимі


2
Це правильний спосіб зробити це, але для цього потрібен демон atd, і для більшості систем потрібно буде встановити пакет.
Джуліан

Ви можете використовувати одинарні лапки, щоб уникнути втечі, і echoвзагалі відмовитися , використовуючи гередок або єрестрі.
Кріс Даун

@Julian, atце стандартна команда POSIX. Яка система, схожа на Unix, не використовує її за замовчуванням?
Стефан Шазелас

1
@ StéphaneChazelas - гарне запитання. я знаю, у мене була ця проблема, але це було деякий час тому. Я трохи перевірив і команда at здається досить всюдисущою. Крім того, здається, що atd є специфічним для Linux, і навіть у деяких системах Linux може бути замінений кронним демоном стилю 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}"; }замість цього запропонувати ?
манатура

1
Я думаю, це слід прочитати doWhateverWithDelay 3 &у вашому другому прикладі.
Baarn

@manatwork: Привіт.
goldilocks

1
@goldilocks, найважливішим у використанні $@є те, що ви можете його цитувати та буде розширено як список слів, що цитуються. Тож краще зробіть це "$@"(або "${@}"якщо вам подобаються брекети). Дивіться pastebin.com/MU7hbB2C
манатура

@manatwork: Точка прийнята;) Я намагався це використовувати аргументи з echo ( -n), але, очевидно, це було трохи наївно.
goldilocks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.