Jaki jest praktyczny przykład użycia polecenia zawieszenia w Bash?

12

suspendto wbudowane polecenie w Bash. Kiedy naturalnie użyjesz tego polecenia i uznasz je za przydatne?

Igor
źródło
1
Sama powłoka zawiesza Everytime to rozwidla proces potomny, czyli wykonuje polecenie, gdzie wspomniane polecenie jest zewnętrzny program, wymagający fork/execwywołanie systemowe
the_velour_fog
1
W powłoce interaktywnej pozwala to procesowi potomnemu przejąć kontrolę nad terminalem, nie powodując interakcji powłoki nadrzędnej z terminalem, co powoduje bałagan.
the_velour_fog
2
@velour, ale to nie wymaga uruchomienia osobnego polecenia w tym celu?
ilkkachu
@ thevvelour_fog Technicznie rzecz biorąc, powłoka nadrzędna nie jest zawieszona (nie otrzymuje STOPsygnału), gdy wywołuje proces potomny. Jestem trochę zdezorientowany twoim drugim komentarzem.
Kusalananda
1
@Kusalananda ok, dobrze wait()brzmi rozsądnie dla mnie. Powiedziałem, że Powłoka zawiesza się za każdym razem, gdy wywołuje proces potomny . Nie mówiłem nic o otrzymywaniu sygnałów stop, co nie miałoby sensu.
the_velour_fog

Odpowiedzi:

14

Powiedzmy, że brakuje ci zarówno GNU, jak screeni tmux(i X11 oraz konsol wirtualnych), ale chcesz przełączać się między powłoką logowania a inną powłoką interaktywną.

Najpierw zaloguj się na konsoli, a następnie uruchom nową powłokę, tymczasowo blokując powłokę logowania. Aby odzyskać powłokę logowania, aby wykonać tam trochę pracy, zrobiłbyś to suspend. Następnie musisz fgodzyskać interaktywną powłokę, aby kontynuować wszystko, co tam zrobiłeś.

W rzeczywistości, z kontrolą pracy, powłoka logowania mogłoby zapoczątkować szereg interaktywnych muszli jako zadania w tle, które można przełączyć się z fg %1, fg %2itd., Ale aby wrócić do powłoki logowania, trzeba by użyć suspend, jeśli nie chciał ręcznie kill -s STOP $$.

Zauważ też, że Ctrl+ Zpo znaku zachęty w interaktywnej powłoce go nie zawiesi.

EDYCJA: Początkowo miałem długą hipotetyczną sekcję dotyczącą użycia suspendskryptu, ale ponieważ polecenie wymaga kontroli zadań, a ponieważ powłoki nieinteraktywne zwykle nie mają kontroli zadań, usunąłem tę sekcję.


Usunięta sekcja z suspendzastąpioną przez kill -s STOP $$(to naprawdę nie należy już do odpowiedzi, ale i tak może być interesujące dla innych):

Załóżmy, że masz skrypt działający w tle (skrypt) i że ten proces w pewnym momencie musi się zatrzymać i poczekać, aż proces nadrzędny poinformuje go o kontynuacji. Może to być tak, że rodzic ma czas na wyodrębnienie i przeniesienie plików na miejsce lub coś w tym rodzaju.

Skrypt potomny zawiesiłby się ( kill -s STOP $$), a skrypt nadrzędny wysłałby CONTdo niego sygnał, gdy będzie mógł kontynuować.

Daje to możliwość zaimplementowania pewnego rodzaju synchronizacji między procesem nadrzędnym a procesem potomnym (choć bardzo podstawowy, ponieważ proces powłoki rodzicielskiej mniej więcej musi zgadywać, że proces potomny jest zawieszony, chociaż można to naprawić poprzez posiadanie potomka pułapki CONTi nie zawieszaj się, jeśli sygnał ten zostanie odebrany zbyt wcześnie).

Kusalananda
źródło