( 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 sleep
albo echo
albo 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/noautostart
uruchomię główną aplikację, nie uruchomi się. Jeśli watchdog się uruchomi, rm /tmp/startdelay
nie 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ń.
&
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()
grupy w tle , oryginalna powłoka zatrzyma się, aż spawn skończy się.)użyj
at
poleceniaktóre będą działać w tle
źródło
echo
całkowicie zrezygnować , używając heredoc lub herestring.at
to standardowe polecenie POSIX. Jaki system uniksowy domyślnie nie jest dostępny?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:
Zostanie to wydrukowane,
hello
a następnie 3 sekundy później (po wyjściu z programu głównego), wydrukujworld
.Ważną częścią jest
&
rozwidlenie wykonania funkcji w tle.źródło
runWithDelay () { sleep $1; "${@:2}"; }
zamiast tego mogę zasugerować ?doWhateverWithDelay 3 &
w twoim drugim przykładzie.$@
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-n
), ale oczywiście było to trochę naiwne.