Qual é o objetivo do comando bash `suspend` builtin?

22

Digitei help suspende recebi esta breve explicação:

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.

Como eu entendo isso é: eu digito suspende o terminal congela, nem o strg + c pode descongelar. Mas quando abro outro terminal e procuro o PID para o congelado e digito kill -SIGCONT PID-NRum sinal SIGCONT, ele é enviado para o terminal congelado e o derrete, para que descongele.

Mas qual é o objetivo real de suspender um terminal? Quais aplicativos todos os dias são típicos para isso? O que as pessoas que fizeram uma concha embutida tinham em mente?

tubarão
fonte
2
evite executar programas externos (kill) para suspensão.
Ipor Sircer

Respostas:

23

Se você iniciar um shell a partir de outro shell, poderá suspender o interno. Diga ao usar sue desejando voltar ao usuário comum por um momento:

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

(Se você fizer isso, não esqueça o shell privilegiado aberto em segundo plano ...)

Da mesma forma, se você escapar para um shell de outro programa (o !comando, por exemplo less), ainda poderá suspender o shell. Mas eu não esperaria que muitos outros programas lidassem bem com isso quando lançassem um subprocesso, que então se suspende.

ilkkachu
fonte
1
Eu apenas tentei correr vime fiz um :shpara obter um subshell (especificamente, um zshsubshell). A corrida suspendme colocou no shell original (ele suspendeu o subshell e o vim).
Kevin
1
@ Kevin, zshparece mais inteligente nisso do bashque tentei fugir para ambos lesse para o vi(Debian vim.tiny): zshparei o aplicativo pai também, bashpendurou a coisa toda. bashpara bashobras embora.
Ilkkachu
1
Eu não sabia que o que digito sudo su a subshell foi iniciado. quando digitei suspend no shell principal, o shell simplesmente congela, mas como você mostrou, quando eu o envio dentro do subshell, volto automaticamente para o shell principal.
sharkant # 12/17
25

É o equivalente a pressionar Ctrl+Zem outros comandos.

Ele suspende o shell e devolve o controle ao shell ou processo pai, se houver.

Exemplo:

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

O recurso vem do csh, o shell do BSD (de onde vem o controle de tarefas) no início dos anos 80 .

Na AT&T ksh, é um alias interno para kill -s STOP $$( sim, sem as aspas! )

No seu caso, bashprovavelmente foi o iniciado diretamente pelo emulador de terminal. E o seu emulador de terminal não esperava que o processo fosse suspenso.

Esse bashfoi um líder de sessão. Se o líder da sessão for suspenso, se considerarmos os terminais antigos, o usuário não terá como retomar isso.

bashendereços que, recusando suspendse for um shell de login. Mas no seu caso, seu emulador de terminal provavelmente não inicia bashno modo de logon, de modo que a proteção não está em vigor.

zshe mkshnão tem o problema porque eles enviam um sinal SIGTSTP(o que também foi enviado Ctrl+Z) como csh, em vez de SIGSTOP(e para o grupo de processos do chamador, mkshcomo no csh, e para o grupo de processos principal do shell zsh, não apenas o $$processo ) SIGTSTPé ignorado quando entregue a um grupo de processos órfãos e o grupo do líder é qualificado. A idéia é que o SIGTSTP não suspenda algo que não possa ser retomado por um usuário.

Em mkshou yash, também se pode usar suspendpara que um 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

Isso não funcionaria com zsho envio do SIGTSTP ao grupo de processos principal em vez do chamador. Em qualquer shell que tenha sido killconstruído, sempre é possível usar kill -s TSTP 0.

Stéphane Chazelas
fonte
4
Você pode citar um uso comum do suspend is: in bash (e provavelmente muitos shells): quando você iniciou um comando longo e não deseja interrompê-lo, mas desejou que o fizesse em segundo plano (ou seja, você deseja, command .... &mas você esqueceu o &e agora deseja poder adicioná-lo sem interromper o comando): você pode: ctrl-ze, em seguida, digite: bgpara retomar a última tarefa suspensa em segundo plano. (ou bg %nde fazer isso com o número de tarefa nUse. jobspara obter uma lista de tarefas suspensos ou em execução)
Olivier Dulac
5
@ OlivierDulac, isso não explicaria para que serve o suspend comando real .
Curinga