Diferenças entre “command & disown” e “nohup command & disown”

24

Este é o meu entendimento sobre o uso de & , disown e nohup :

  • <command> : executa o processo na instância atual bash do terminal, em primeiro plano (ou seja, o processo é listado como um trabalho em primeiro plano bash e stdin , stdout e stderr ainda estão ligados ao terminal ); não está imune a restrições ;
  • <command> & : executa o processo na instância atual bash do Terminal, em segundo plano (ou seja, o processo é listado como um trabalho em segundo plano bash e stdin , stdout e stderr ainda estão ligados ao terminal ); não está imune a restrições ;
  • <command> & disown : executa o processo na instância bash atual do Terminal, em segundo plano , mas o processo é separado da lista de empregos bash ( ou seja, o processo não está listado como um trabalho de foreground / background bash e stdin , stdout e stderr ainda estão ligados ao terminal ); imune a hangups ;
  • nohup <command> & disown : executa o processo na instância bash atual do Terminal, em segundo plano , mas o processo é separado da lista de empregos bash ( ou seja, o processo não está listado como bash primeiro plano / trabalho em segundo plano e stdin , stdout e stderr estão não ainda ligados ao terminal ); imune a hangups ;

Portanto, além de nohup <command> & disown bloquear stdin e redirecionar stdout e stderr para nohup.out por padrão, parece-me que pode ser considerado totalmente equivalente a <command> & disown .

O acima de tudo está correto? Qualquer equívoco?

    
por kos 21.04.2015 / 11:22

2 respostas

18

Seu entendimento é basicamente correto. Tanto disown como nohup são usados para permitir que você saia de uma sessão de shell em execução sem interromper a execução de tarefas. Alguns esclarecimentos:

  • Não há motivo para executar nohup command & disown , nohup já o negará para você.

  • nohup é definido pelo POSIX enquanto disown não é . Isso significa que, embora muitos shells (por exemplo, bash , zsh , ksh ) o tenham, outros (por exemplo, tcsh , csh , dash e sh ) não o terão.

  • disown pode ser usado após um comando foi iniciado enquanto nohup deve ser usado antes.

Tanto quanto eu posso dizer, o efeito real dos dois comandos é o mesmo. Cada um tem recursos que o outro não possui (veja help disown e man nohup ), mas sua função básica é a mesma, sim.

    
por terdon 21.04.2015 / 17:51
7

Seu primeiro ao terceiro ponto parece certo, embora stdin, stdout and stderr are still bound to the terminal não seja uma noção correta. stdin está sempre ligado ao terminal no sentido de que você sempre inseriria o nome do arquivo em um comando via terminal ou formas usando terminal. stdout and stderr are still bound to the terminal está bem.

Você tem stdin, stdout and stderr are not still bound to the terminal no quarto ponto que não está certo, como mencionado no meu parágrafo anterior. Também aqui você está usando /dev/null como o arquivo de entrada para o command , por exemplo, se o comando for cat , você o usará como cat /dev/null .

O comando no seu 5º ponto não está colocado corretamente, você usou nohup <command> & disown , enquanto usa qualquer um dos nohup ou disown o outro não é necessário. Seus propósitos são os mesmos (ignorar o SIGHUP ), mas funcionam de maneira um pouco diferente. Então o comando pode ser simplificado como nohup <command> & .

    
por heemayl 21.04.2015 / 11:51