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 ksh
jest to wbudowany alias dla kill -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 ten suspend
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
i mksh
nie 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 mksh
np. w csh, i do głównej grupy procesów powłoki dla zsh
, 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
lub yash
można również suspend
zawiesić 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, zsh
ponieważ wysyła SIGTSTP do głównej grupy procesów zamiast do wywołującego. W każdej kill
wbudowanej powłoce zawsze można użyć kill -s TSTP 0
zamiast tego.