Qual é a função do comando nohup?

18

Eu sou um novato no Ubuntu. Eu aprendi um comando

nohup [command] - corre <command> imune ao sinal de interrupção

Não consigo entender o significado de " imune ao sinal de desligamento ". De que tipo de sinal está falando? E, por favor, diga-me como usar este comando com um exemplo.

coding_ninza
fonte
Se disponível no seu shell, disowné uma alternativa melhor para nohup. Coloque um plano de fundo em um comando com command &ou Ctrl-Ze use-o disownpara desanexá-lo do shell.
John Kugelman apoia Monica
@JohnKugelman que não é suficiente , você também desviou o fluxo de entrada, saída e erro. Então, por que não usar 'nohup' que faz isso automaticamente para você?
precisa saber é o seguinte

Respostas:

34

Vamos considerar que você abriu um gediteditor de texto em um terminal e está trabalhando nele. Se você fechar o terminal antes de fechar gedit, o gedit também será fechado assim que o fechar. Então, o que está acontecendo aqui? É geditexecutado como um processo filho sob o terminal. Quando você fecha o terminal, um sinal de desligamento (SIGHUP ) é enviado ao processo que interrompe o processo filho.

Por outro lado, se você deseja que seu processo filho (aqui gedit) continue em execução mesmo após o fechamento do terminal pai, você deseja que seu processo seja imune ao sinal de interrupção. Para que o fechamento do terminal não feche o processo filho. nohupfaz exatamente esse trabalho.

nohupnão desconecta um comando do terminal , faz com que seu script ignore o SIGHUP e redireciona stdout / stderr para um arquivo nohup.out, para que o comando possa continuar em execução em segundo plano após o logout. Se você fechar o shell / terminal ou efetuar logoff, seu comando não será mais filho desse shell. Pertence ao processo init. Se você pesquisar, pstreeverá que agora pertence ao processo 1 (init). Isso não pode ser trazido de volta ao primeiro plano porque o primeiro plano não existe mais.

souravc
fonte
16

Além do que a @sourvac escreveu, esse é um legado do Back In The Day, quando as pessoas se conectavam por meio de terminais burros somente de texto, geralmente via modem (o original, analógico de 110 baud): o "desligamento" está literalmente "desligando o telefone "

Um pid imune ao sinal de interrupção continuará sendo executado mesmo depois que você sair e desligar o telefone . Isso era muito útil em computadores lentos quando os trabalhos eram executados por horas e horas, e você não podia ficar conectado (alguém precisava usar o terminal, precisava usar o telefone, a estática na linha pode "interromper" a conexão etc).

RonJohn
fonte
11
Não apenas de volta ao dia. Eu executo a maioria dos meus trabalhos grandes em um cluster de servidores no qual ssh. Se eu não usasse nohup, precisaria deixar meu laptop conectado a essas máquinas por dias enquanto aguardava a conclusão dos trabalhos.
Ray
@ Ray, que tal executá-los via "at" ou como trabalhos cron?
RonJohn
@RonJohn Sure. Ou através de um mecanismo de grade. Não pretendia sugerir que o nohup era a única opção, apenas que ainda é usado para esse fim hoje.
Ray
11
Talvez suas observações históricas estejam corretas. Mas suas conclusões sobre sua importância atual estão erradas. Não é útil em computadores lentos, mas é útil para trabalhos de longa execução. Estas são duas coisas diferentes. Você usa o 'nohup' para proteger seu trabalho contra a desconexão pretendida ou não intencional do seu terminal. Hoje em dia, você não fica satisfeito se um trabalho é interrompido porque um erro de rede desconecta o terminal e o trabalho é interrompido.
precisa saber é o seguinte
Os trabalhos do @Ray Cron são completamente inapropriados para conseguir isso. Cronjobs são para tarefas periódicas, você precisa definir o ambiente no cronjob e considerar muitas outras coisas. Talvez 'at' seja um pouco mais fácil de manusear, mas, no entanto, mais complexo que o nohup.
miracle173