Czy można obudzić proces wstrzymany za pomocą sleep
polecenia?
Na przykład załóżmy, że masz ten skrypt:
#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"
Po 30 minutach odkrywasz, że potrzebujesz zatrzymać skrypt, to znaczy żałowałeś, że nie napisałeś sleep 30m
.
Nie chcesz dzwonić kill PID
ani naciskać Ctrl+ C, ponieważ wtedy ostatnie polecenie nie zostanie wykonane i będziesz zmęczony.
Czy istnieje sposób na sleep
wybudzenie procesu lub użycie innego polecenia obsługującego wybudzanie? Mile widziane są rozwiązania zarówno procesów w tle, jak i na pierwszym planie.
command-line
bash
Bittenus
źródło
źródło
gawk
ing naprawdę nie działa. Ostatnim razem, gdy miałemsleep
proces ing, zrzuciłempushd
go z łóżka.#!
wiersza. I to ma znaczenie, ponieważ odpowiedź na twoje pytanie zależy od tego, czy coś jest-e
w#!
linii.#!/bin/bash -e
, skrypt zatrzyma się po błędzie. Po prostu zabicie komendy uśpienia będzie traktowane jako błąd przez bash. Oznacza to,-e
że bez odpowiedzi na twoje pytanie jest dość prosta. Jeśli-e
zostanie użyty, stanie się o wiele trudniejszy, ponieważ musisz zatrzymać proces snu bez zabijania go.Odpowiedzi:
Kiedy skrypt Bash uruchamia a
sleep
, oto jakpstree
może wyglądać:Oba mają identyfikatory procesów (PID), nawet jeśli działają jako skrypty. Gdybyśmy chcieli przerwać sen, wysłalibyśmy
kill 8506
i sesja Bash wznowiłaby ... Problem polega na tym, że w środowisku skryptowym nie znamy PIDsleep
polecenia i nie ma człowieka, aby spojrzeć na proces drzewo.Możemy uzyskać PID sesji Bash poprzez
$$
zmienną magiczną. Jeśli możemy to gdzieś przechowywać, możemy następnie celować w instancjesleep
, które działają pod tym PID. Oto, co umieściłem w skrypcie:A potem możemy powiedzieć instancjom
pkill
nuklearnymsleep
działającym pod tym PID:Ponownie ogranicza się to tylko do
sleep
procesów działających bezpośrednio w ramach jednej sesji Bash. Tak długo, jak PID był poprawnie zalogowany, czyni go znacznie bezpieczniejszym niżkillall sleep
lubpkill sleep
, co może spowodować uszkodzenie dowolnegosleep
procesu w systemie (zezwalając na uprawnienia).Możemy udowodnić tę teorię na następującym przykładzie, w którym mamy trzy osobne sesje bash, dwie uruchomione
sleep
. Tylko dlatego, że określamy PID w lewej górnej sesji bash, tylko jejsleep
jest zabijana.Alternatywnym podejściem jest przesunięcie
sleep
w tło, zapisanie jego PID, a następnie powrót na pierwszy plan. W skrypcie:I zabić to:
źródło
Możesz napisać skrypt do obsługi („pułapki”) innych sygnałów z zabicia itp., Aby w razie potrzeby zmodyfikować zachowanie skryptu. Zobacz man bash:
źródło
Możesz po prostu zabić sen, który przejdzie do następnego wiersza skryptu:
Zauważ, że zabiłoby to każdy proces uśpienia uruchomiony w twoim systemie, nie tylko w twoim skrypcie.
źródło
Mam skrypt do spania uruchamiany
cron
przy uruchamianiu. Skrypt budzi się co minutę i ustawia jasność wyświetlacza laptopa na podstawie wschodu i zachodu słońca uzyskanego z Internetu. Konfigurowalna przez użytkownika faza przejścia między pełnym rozjaśnieniem a pełnym przyciemnieniem wymaga zwiększania i zmniejszania wartości o 3, 4, 5 lub cokolwiek obliczanego co minutę.Oli krótko poruszył
pstree
swoją odpowiedź, ale odrzucił ją, ponieważ zabiłoby to wszystkiesleep
przypadki. Można tego uniknąć, zawężając wyszukiwanie za pomocą opcji pstree.Używając
pstree -h
widzimy całą heirarchię:Jak widać typowy login Ubuntu zawiera wiele wielu identyfikatorów PID (ID procesów).
Możemy zawęzić go do naszego działającego skryptu, używając:
Widzimy:
cron
uruchomił powłokę (identyfikator procesu 1308 i identyfikator sesji 1308)sleep
proces o numerze ID 26552 i ponownie o sesji o numerze 1308W tym momencie możemy użyć
pkill -s 1308
i zabiłoby to całą sesję, która zawiera powłokę, nasz programdisplay-auto-brightness
isleep
polecenie. Zamiast tego użyjemykill 26552
tylko do zabicia polecenia uśpienia, co zmusi nasz program do przebudzenia i dostosowania jasności.Wpisując to ręcznie w terminalu zobaczysz:
Następnym krokiem jest zrobienie tego, gdy laptop budzi się z zawieszenia. Na przykład po zamknięciu pokrywy było całkowicie ciemno, a jasność ekranu ustawiono na „300”. Po otwarciu pokrywy jest światło dzienne, a jasność należy ustawić na „2000”. Oczywiście program sam się obudzi w ciągu 1 do 59 sekund, ale wygodniej jest natychmiast ustawić jasność.
Po napisaniu opublikuję kod zawieszenia / wznowienia. Mam nadzieję, że w ten weekend.
źródło