Napisałem na maszynie help suspend
i 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ę, suspend
a 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-NR
wpisuję 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ę?
bash
signals
suspend
shell-builtin
rekin
źródło
źródło
Odpowiedzi:
Jeśli uruchomisz powłokę z innej, możesz zawiesić wewnętrzną. Powiedz, kiedy używasz
su
i chcesz na chwilę wrócić do zwykłego użytkownika:(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.źródło
vim
i zrobiłem a,:sh
aby uzyskać podpowłokę (konkretniezsh
podpowłokę). Uruchomieniesuspend
wrzuciło mnie do oryginalnej powłoki (zawiesiło zarówno podpowłokę, jak i vima).zsh
wydaje się w tym mądrzejszy niżbash
, próbowałem uciec zarówno do obu, jakless
ivi
(Debianvim.tiny
):zsh
zatrzymałem też aplikację nadrzędną,bash
zawiesiłem całą sprawę.bash
jednakbash
działa.Jest to odpowiednik naciskania Ctrl+Zinnych poleceń.
Zawiesza powłokę i daje kontrolę nad powłoką macierzystą lub procesem, jeśli istnieje.
Przykład:
Ta funkcja pochodzi z csh, powłoki BSD (skąd pochodzi kontrola zadań) na początku lat 80 .
W AT&T
ksh
jest to wbudowany alias dlakill -s STOP $$
( tak, bez cudzysłowów! )W twoim przypadku
bash
prawdopodobnie był on uruchamiany bezpośrednio przez emulator terminala. I twój emulator terminalu nie spodziewał się, że proces zostanie zawieszony.To
bash
był 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ć.bash
rozwiązuje tensuspend
problem, odmawiając, jeśli jest to powłoka logowania. Ale w twoim przypadku emulator terminala prawdopodobnie nie uruchamia siębash
w trybie logowania, więc nie ma zabezpieczenia.zsh
imksh
nie mają problemu, ponieważ wysyłają sygnałSIGTSTP
(ten również przesłany Ctrl+Z) jak csh zamiastSIGSTOP
(i do grupy procesów wywołującej dlamksh
np. w csh, i do głównej grupy procesów powłoki dlazsh
, nie samego$$
procesu ).SIGTSTP
jest 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
mksh
lubyash
można równieżsuspend
zawiesić podpowłokę:To nie zadziałałoby,
zsh
ponieważ wysyła SIGTSTP do głównej grupy procesów zamiast do wywołującego. W każdejkill
wbudowanej powłoce zawsze można użyćkill -s TSTP 0
zamiast tego.źródło
command .... &
ale chcesz zapomniałem&
i teraz chciałbym móc go dodać bez przerywania polecenia): możesz:,ctrl-z
a następnie wpiszbg
:, aby wznowić ostatnie zawieszone zadanie w tle. (lubbg %n
zrobić to z numerem zadanian
. Użyj,jobs
aby uzyskać listę zawieszonych lub uruchomionych zadań)suspend
polecenie .