Escribí help suspend
y 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 suspend
y 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-NR
escribo 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?
bash
signals
suspend
shell-builtin
Sharkant
fuente
fuente
Respuestas:
Si inicia un shell desde otro shell, puede suspender el interno. Diga al usar
su
y querer volver al usuario normal por un momento:(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 ejemploless
), 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.fuente
vim
e hice un:sh
para obtener una subshell (específicamente, unazsh
subshell). La ejecuciónsuspend
me introdujo en el shell original (suspendió tanto el subshell como el vim).zsh
parece más inteligente que esobash
, intenté escapar de ambosless
yvi
(Debian'svim.tiny
): tambiénzsh
detuve la aplicación principal,bash
colgué todo.bash
a lasbash
obras sin embargo.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:
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 parakill -s STOP $$
( sí, ¡sin las comillas! )En su caso,
bash
probablemente fue el que inició directamente el emulador de terminal. Y su emulador de terminal no esperaba que se suspendiera el proceso.Ese
bash
fue 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.bash
aborda eso al negarsesuspend
si es un shell de inicio de sesión. Pero en su caso, su emulador de terminal probablemente no se iniciabash
en el modo de inicio de sesión, por lo que la protección no está en su lugar.zsh
ymksh
no tienen el problema porque envían una señalSIGTSTP
(la que también se envió Ctrl+Z) como csh en lugar deSIGSTOP
(y al grupo de proceso de la persona que llamamksh
como en csh, y al grupo de proceso principal del shell parazsh
, no$$
solo el proceso )SIGTSTP
se 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
mksh
oyash
, también se puede usarsuspend
para que una subshell se suspenda:Eso no funcionaría con
zsh
eso envía el SIGTSTP al grupo de proceso principal en lugar del llamador. En cualquier shell que tengakill
incorporado, siempre se puede usarkill -s TSTP 0
en su lugar.fuente
command .... &
pero olvidé el&
y ahora deseo poder agregarlo sin interrumpir el comando): puede:ctrl-z
y luego escribir:bg
para reanudar la última tarea suspendida en segundo plano. (obg %n
para hacer esto con el número de tarean
. Utilícelojobs
para obtener una lista de tareas suspendidas o en ejecución)suspend
comando real .