Jaki jest cel wbudowanego polecenia bash `Suspend`?


22

Napisałem na maszynie help suspendi otrzymałem to krótkie wyjaśnienie:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

Rozumiem to: piszę, suspenda terminal zawiesza się, nawet strg + c nie może go odblokować. Ale kiedy otwieram inny terminal i szukam PID dla zamrożonego i kill -SIGCONT PID-NRwpisuję sygnał SIGCONT jest wysyłany do zamrożonego terminala i rozmraża go, aby się odmroził.

Ale jaki jest rzeczywisty cel zawieszenia terminala? Które aplikacje na co dzień są dla niego typowe? Co mieli na myśli ludzie, którzy stworzyli wbudowaną powłokę?


2
unikać uruchamiania programów zewnętrznych (kill) w celu zawieszenia.
Ipor Sircer

Odpowiedzi:


23

Jeśli uruchomisz powłokę z innej, możesz zawiesić wewnętrzną. Powiedz, kiedy używasz sui chcesz na chwilę wrócić do zwykłego użytkownika:

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(Jeśli to zrobisz, nie zapomnij o uprzywilejowanej powłoce otwartej w tle ...)

Podobnie, jeśli uciekniesz do powłoki z innego programu ( !polecenie np. less), Nadal możesz zawiesić powłokę. Ale nie spodziewałbym się, że wiele innych programów ładnie sobie z tym poradzi, gdy uruchomią podproces, który następnie się zawiesi.


1
Właśnie próbowałem uruchomić vimi zrobiłem a, :shaby uzyskać podpowłokę (konkretnie zshpodpowłokę). Uruchomienie suspendwrzuciło mnie do oryginalnej powłoki (zawiesiło zarówno podpowłokę, jak i vima).
Kevin

1
@Kevin, zshwydaje się w tym mądrzejszy niż bash, próbowałem uciec zarówno do obu, jak lessi vi(Debian vim.tiny): zshzatrzymałem też aplikację nadrzędną, bashzawiesiłem całą sprawę. bashjednak bashdziała.
ilkkachu

1
nie wiedziałem, że to, co wpisuję sudo su w podpowłoce, jest uruchomione. kiedy wpisałem zawieszenie w głównej powłoce, powłoka po prostu zawiesza się, ale jak pokazałeś, kiedy podpowiadam to w podpowłoce, automatycznie wracam do głównej powłoki.
rekinant

25

Jest to odpowiednik naciskania Ctrl+Zinnych poleceń.

Zawiesza powłokę i daje kontrolę nad powłoką macierzystą lub procesem, jeśli istnieje.

Przykład:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

Ta funkcja pochodzi z csh, powłoki BSD (skąd pochodzi kontrola zadań) na początku lat 80 .

W AT&T kshjest to wbudowany alias dla kill -s STOP $$( tak, bez cudzysłowów! )

W twoim przypadku bashprawdopodobnie był on uruchamiany bezpośrednio przez emulator terminala. I twój emulator terminalu nie spodziewał się, że proces zostanie zawieszony.

To bashbył lider sesji. Jeśli lider sesji zostanie zawieszony, jeśli weźmiemy pod uwagę stare terminale, użytkownik nie będzie mógł go wznowić.

bashrozwiązuje ten suspendproblem, odmawiając, jeśli jest to powłoka logowania. Ale w twoim przypadku emulator terminala prawdopodobnie nie uruchamia się bashw trybie logowania, więc nie ma zabezpieczenia.

zshi mkshnie mają problemu, ponieważ wysyłają sygnał SIGTSTP(ten również przesłany Ctrl+Z) jak csh zamiast SIGSTOP(i do grupy procesów wywołującej dla mkshnp. w csh, i do głównej grupy procesów powłoki dla zsh, nie samego $$procesu ). SIGTSTPjest ignorowany po dostarczeniu do osieroconej grupy procesów, a grupa lidera kwalifikuje się. Chodzi o to, że SIGTSTP nie powinien zawieszać czegoś, czego użytkownik nie może wznowić.

W mkshlub yashmożna również suspendzawiesić podpowłokę:

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

To nie zadziałałoby, zshponieważ wysyła SIGTSTP do głównej grupy procesów zamiast do wywołującego. W każdej killwbudowanej powłoce zawsze można użyć kill -s TSTP 0zamiast tego.


4
Możesz przytoczyć powszechne użycie zawieszenia: w bash (i prawdopodobnie w wielu powłokach): kiedy uruchomiłeś długie polecenie i nie chcesz go przerywać, ale chciałeś to zrobić w tle (tzn. Chcesz, command .... &ale chcesz zapomniałem &i teraz chciałbym móc go dodać bez przerywania polecenia): możesz:, ctrl-za następnie wpisz bg:, aby wznowić ostatnie zawieszone zadanie w tle. (lub bg %nzrobić to z numerem zadania n. Użyj, jobsaby uzyskać listę zawieszonych lub uruchomionych zadań)
Olivier Dulac

5
@OlivierDulac, to nie wyjaśniałoby, po co jest właściwe suspend polecenie .
Wildcard
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.