¿Cuál es el propósito del comando incorporado bash `suspend`?

22

Escribí help suspendy obtuve esta breve explicación:

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.

Cómo entiendo esto es: escribo suspendy el terminal se congela, ni siquiera strg + c puede descongelarlo. Pero cuando abro otro terminal y busco el PID para el congelado y kill -SIGCONT PID-NRescribo una señal SIGCONT se envía al terminal congelado y lo descongela, para que se descongele.

Pero, ¿cuál es el propósito real de suspender una terminal? ¿Qué aplicaciones diarias son típicas para ello? ¿Qué tenían en mente las personas que lo convirtieron en una concha?

Sharkant
fuente
2
evite ejecutar programas externos (kill) para suspender.
Ipor Sircer,

Respuestas:

23

Si inicia un shell desde otro shell, puede suspender el interno. Diga al usar suy querer volver al usuario normal por un momento:

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

(Si hace eso, no olvide el shell privilegiado abierto en segundo plano ...)

Del mismo modo, si escapa a un shell desde algún otro programa (el !comando en, por ejemplo less), aún puede suspender el shell. Pero no esperaría que muchos otros programas lo manejen bien cuando lanzan un subproceso, que luego se suspende.

ilkkachu
fuente
1
Solo intenté ejecutar vime hice un :shpara obtener una subshell (específicamente, una zshsubshell). La ejecución suspendme introdujo en el shell original (suspendió tanto el subshell como el vim).
Kevin
1
@Kevin, zshparece más inteligente que eso bash, intenté escapar de ambos lessy vi(Debian's vim.tiny): también zshdetuve la aplicación principal, bashcolgué todo. basha las bashobras sin embargo.
ilkkachu
1
no sabía que lo que escribo sudo su a subshell se inicia. cuando escribí suspender en el shell principal, el shell simplemente se congela, pero como lo mostraste, cuando lo subo dentro del subshell vuelvo automáticamente al shell principal.
Sharkant
25

Eso es equivalente a presionar Ctrl+Zotros comandos.

Suspende el shell y devuelve el control al shell principal o al proceso, si lo hay.

Ejemplo:

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

La característica proviene de csh, el shell de BSD (de donde proviene el control del trabajo) a principios de los 80 .

En AT&T ksh, es un alias incorporado para kill -s STOP $$( sí, ¡sin las comillas! )

En su caso, bashprobablemente fue el que inició directamente el emulador de terminal. Y su emulador de terminal no esperaba que se suspendiera el proceso.

Ese bashfue un líder de sesión. Si el líder de la sesión se suspende, si consideramos los terminales antiguos, el usuario no tendrá forma de reanudarlo.

bashaborda eso al negarse suspendsi es un shell de inicio de sesión. Pero en su caso, su emulador de terminal probablemente no se inicia bashen el modo de inicio de sesión, por lo que la protección no está en su lugar.

zshy mkshno tienen el problema porque envían una señal SIGTSTP(la que también se envió Ctrl+Z) como csh en lugar de SIGSTOP(y al grupo de proceso de la persona que llama mkshcomo en csh, y al grupo de proceso principal del shell para zsh, no $$solo el proceso ) SIGTSTPse ignora cuando se entrega a un grupo de proceso huérfano y el grupo del líder califica. La idea es que SIGTSTP no debe suspender algo que un usuario no puede reanudar.

En mksho yash, también se puede usar suspendpara que una subshell se suspenda:

$ (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

Eso no funcionaría con zsheso envía el SIGTSTP al grupo de proceso principal en lugar del llamador. En cualquier shell que tenga killincorporado, siempre se puede usar kill -s TSTP 0en su lugar.

Stéphane Chazelas
fuente
44
Puede citar un uso común para suspender: bash (y probablemente muchos shells): cuando inició un comando largo y no desea interrumpirlo, pero deseaba hacerlo en segundo plano (es decir, quiere command .... &pero olvidé el &y ahora deseo poder agregarlo sin interrumpir el comando): puede: ctrl-zy luego escribir: bgpara reanudar la última tarea suspendida en segundo plano. (o bg %npara hacer esto con el número de tarea n. Utilícelo jobspara obtener una lista de tareas suspendidas o en ejecución)
Olivier Dulac
55
@OlivierDulac, eso no explicaría para qué es el suspend comando real .
Comodín