Qual é um exemplo prático de como usar o comando suspend no Bash?

12

suspendé um comando interno no Bash. Quando você naturalmente usaria esse comando e o consideraria útil?

igor
fonte
1
O shell suspende-se toda vez que ele bifurca um processo filho, ou seja, executa um comando, onde disse comando é um programa externo, exigindo uma fork/execchamada de sistema
the_velour_fog
1
Em um shell interativo, isso permite que o processo filho controle o terminal, sem que o shell pai interaja com o terminal, o que fica confuso.
3141616
2
@velour, mas isso não requer a execução de um comando separado para esse efeito?
21916 ilkkachu
@the_velour_fog Tecnicamente, o shell pai não é suspenso (não recebe STOPsinal) quando se bifurca um processo filho. Também estou um pouco confuso com o seu segundo comentário.
Kusalananda
1
@ Kusalananda ok, certo wait()parece razoável para mim. Eu disse que o shell se suspende toda vez que bifurca um processo filho . Eu não disse nada sobre receber nenhum sinal de parada, isso não faria sentido.
the_velour_fog

Respostas:

14

Digamos que você não possua GNU screene tmux(e X11 e consoles virtuais), mas queira alternar entre um shell de login e outro shell interativo.

Você primeiro faria login no console e, em seguida, iniciaria um novo shell, bloqueando temporariamente o shell de login. Para obter o shell de login de volta para fazer algum trabalho lá, você faria suspend. Em seguida, você solicitaria fgque o shell interativo voltasse para continuar com o que você fez lá.

Na verdade, com controle de trabalho, o shell de login poderia gerar uma série de conchas interativos como trabalhos de fundo que você poderia mudar para com fg %1, fg %2etc., mas para voltar para o shell de login, você precisaria usar suspenda menos que você queria manualmente kill -s STOP $$.

Observe também que Ctrl+ Zno prompt de um shell interativo não o suspenderá.

EDIT: Inicialmente, eu tinha uma longa seção hipotética sobre o uso de suspendem um script, mas como o comando requer controle de tarefas e como shells não interativos geralmente não têm controle de tarefas, excluí essa seção.


Seção excluída com suspendsubstituída por kill -s STOP $$(isso realmente não pertence mais à resposta, mas pode ser interessante para outras pessoas):

Digamos que você tenha um processo em segundo plano (um script) em um script e que em algum momento esse processo em segundo plano precise parar e aguardar o processo pai dizer para continuar. Pode ser que o pai tenha tempo para extrair e mover arquivos para o local ou algo assim.

O script filho suspenderia ( kill -s STOP $$) e o script pai enviaria um CONTsinal para ele quando estivesse tudo bem em continuar.

Ele oferece a oportunidade de implementar uma espécie de sincronização entre um processo pai e um processo filho (embora muito básico, pois o processo do shell pai precisa mais ou menos adivinhar que o processo filho está suspenso, embora isso possa ser corrigido com o filho. interceptar CONTe não suspender se esse sinal for recebido muito cedo).

Kusalananda
fonte