Jak uruchomić polecenie w tle z opóźnieniem?


33

Czy ktoś może mi pokazać, jak stworzyć program do wykonania tej czynności: po 5 minutach

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

Chcę, aby ten program działał w tle (jak rngdusługa). Nie mogę tego zrobić, ponieważ nie wiem zbyt wiele o Linuksie.

Odpowiedzi:


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

W ten sposób skrypt kontynuuje działanie lub natychmiast przywracasz kontrolę, podczas gdy rozpoczyna się nowe zadanie skryptu w tle, z dwoma poleceniami: uśpienie i echo.

Wspólna błąd próbuje dać albo sleepalbo echoalbo zarówno &które nie będą działać zgodnie z przeznaczeniem. Uruchomienie szeregu poleceń powoduje ()jednak ich odrodzenie w osobnym procesie powłoki, z którym możesz następnie wysłać całe tło &.


Do tego dowcipu, gdzie uważam, że jest to aktywnie przydatne. W urządzeniu wbudowanym rozwijam główną aplikację, która współpracuje z organem nadzorującym. Jeśli nie powiedzie się to w sposób, który uruchamia resetowanie watchdoga wkrótce po uruchomieniu, trudno jest to naprawić zdalnie, ponieważ okres między uruchomieniem systemu operacyjnego a resetowaniem jest dość krótki, niewystarczający do ssh i zablokowania uruchamiania aplikacji. Potrzebuję więc sposobu, aby ustalić, że system został ponownie uruchomiony tak szybko i wprowadzić opóźnienie, jeśli tak, aby dać sobie czas na ręczne naprawienie.

 [ -f /tmp/startdelay ] && sleep 30
 touch /tmp/startdelay
 ( sleep 30 ; rm /tmp/startdelay ) &
 [ -f /tmp/noautostart ] && exit 0
 start_app

Jeśli się zaloguję i touch /tmp/noautostarturuchomię główną aplikację, nie uruchomi się. Jeśli watchdog się uruchomi, rm /tmp/startdelaynie zostanie wykonany, a przy następnym uruchomieniu systemu da mi dodatkowe 30 sekund, aby go zatrzymać. W przeciwnym razie restart nastąpi szybko, bez opóźnień.


Tak, zgadzam się, ale może to być również część refleksji użytkownika ;-)
Kiwy,

W innych odpowiedziach brakuje części „w tle”. Nie, jasno to powiedziałem: /
goldilocks

@Goldilocks: Dodałeś wysyłanie do części tła dopiero po opublikowaniu mojej odpowiedzi.
SF.

Nie, moją pierwotną odpowiedzią było uruchomienie funkcji zawierającej sen w &celu uśpienia w tle; „musisz także zasnąć w tle” było w pierwszej linii od samego początku. Jeśli mi nie wierzysz, spójrz na historię edycji. A moja odpowiedź jest o 5 minut starsza niż twoja: P
goldilocks

1
@gekannt: ... uh, pytanie brzmi: "Jak uruchomić polecenie w tle z opóźnieniem?" - jak inaczej byś to osiągnął? (i nie, jeśli nie stworzysz ()grupy w tle , oryginalna powłoka zatrzyma się, aż spawn skończy się.)
SF.

11

użyj atpolecenia

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

które będą działać w tle


2
Jest to właściwy sposób, aby to zrobić, ale wymaga uruchomionego demona ATD, a na większości systemów musi być zainstalowany pakiet.
Julian

Możesz użyć pojedynczych cudzysłowów, aby uniknąć ucieczki, i echocałkowicie zrezygnować , używając heredoc lub herestring.
Chris Down

@Julian, atto standardowe polecenie POSIX. Jaki system uniksowy domyślnie nie jest dostępny?
Stéphane Chazelas

1
@ StéphaneChazelas - dobre pytanie. wiem, że miałem ten problem, ale to było jakiś czas temu. Sprawdziłem trochę, a polecenie wydaje się dość wszechobecne. Wydaje się również, że atd jest specyficzny dla Linuksa i nawet w niektórych systemach Linux może zostać zastąpiony demonem cron typu BSD. Rozważmy mój komentarz za nieaktualny.
Julian

Próbowałem „at” i nie znaleziono polecenia na Androidzie 8
beppe9000,

6

Jeśli chcesz, aby coś uruchomiło się w ciągu 5 minut, ale reszta programu będzie kontynuowana (lub zakończy się), musisz również ustawić tło snu w tle:

#!/bin/bash

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

runWithDelay 3 echo world &
echo hello    

Zostanie to wydrukowane, helloa następnie 3 sekundy później (po wyjściu z programu głównego), wydrukuj world.

Ważną częścią jest &rozwidlenie wykonania funkcji w tle.


1
Czy runWithDelay () { sleep $1; "${@:2}"; }zamiast tego mogę zasugerować ?
manatwork

1
Myślę, że powinien przeczytać doWhateverWithDelay 3 &w twoim drugim przykładzie.
Baarn

@manatwork: Cheers.
goldilocks

1
@Goldilocks, niezbędne w użyciu $@jest to, że możesz zacytować i zostanie rozwinięty jako lista cytowanych słów. Więc lepiej to zrób "$@"(lub "${@}"jeśli lubisz aparat ortodontyczny). Zobacz pastebin.com/MU7hbB2C
manatwork

@manatwork: Punkt wzięty;) Próbowałem tego używając argumentów z echo ( -n), ale oczywiście było to trochę naiwne.
goldilocks
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.