Como usar o nohup para executar comandos em background e mantê-lo a funcionar após você sair da shell promt

a Maior parte do tempo você faz o login no servidor remoto via ssh. Se iniciar um programa ou Comando de consola e sair (abortar a ligação remota), o processo/comando será morto. Às vezes um trabalho ou comando leva muito tempo. Se você não tem certeza de quando o trabalho vai terminar, então é melhor deixar o trabalho funcionando em segundo plano., Mas, se você sair do sistema, o trabalho será interrompido e terminado pela sua concha. O que você faz para manter o job funcionando em segundo plano quando o processo fica SIGHUP?

nohup command to the rescue

nestas situações, podemos usar nohup command line-utility que permite executar comando/processo ou shell script que pode continuar a correr em segundo plano depois de sair de uma shell.

nohup é um comando POSIX para ignorar o sinal HUP (Hup)., O sinal HUP é, por convenção, a forma como um terminal alerta processos dependentes de logout.

saída que normalmente iria para o terminal vai para um arquivo chamado nohup.para fora se ainda não tiver sido redireccionado.

nohup sintaxe de comando:

a sintaxe é A seguinte

$ nohup command-name &$ exit

ou

$ nohup /path/to/command-name arg1 arg2 > myoutput.log &$ exit

Onde

  • command-name: é o nome do script de shell de comando ou nome. Você pode passar o argumento para o comando ou um script shell.,
  • &: nohup não coloca automaticamente o comando que ele executa em segundo plano; você deve fazer isso explicitamente, terminando a linha de comando com um símbolo &.
  • exit: depois de nohup e & iniciar o comando no fundo, você ainda vai ter a escreva exit ou CTRL-D para voltar ao bash cursor.,

Use postos de comando l para listar todas as vagas de emprego:

$ jobs -l

nohup exemplos de comandos

Primeiro, de início de sessão ao servidor remoto usando ssh comando:

$ ssh [email protected]

eu estou indo para executar um script shell chamado pullftp.sh:

$ nohup pullftp.sh &

Digite exit ou pressione CTRL + D para sair do servidor remoto:

> exit

neste exemplo, eu vou encontrar todos os programas e scripts com setuid bit definida como activar, introduza:

$ nohup find / -xdev -type f -perm +u=s -print > out.txt &

Digite exit ou pressione CTRL + D para sair do servidor remoto., O trabalho continua a correr depois de saíres.

> exit

nohup é muitas vezes usado em combinação com o comando nice para executar processos em uma prioridade menor.

Por Favor, note que o nohup não altera a prioridade de escalonamento do comando; use o comando nice para esse efeito. Por exemplo:

$ nohup nice -n -5 ls / > out.txt &

como você pode ver nohup manter os processos em execução depois de sair de uma shell. Leia a página man do nohup(1) e nice (1) para mais informações. Por favor, note que o nohup está quase Disponível nas variantes Solaris/BSD/Linux/UNIX.,

What’s the difference between nohup and ampersand (&)

Bothnohup myprocess.out & ormyprocess.out & set myprocess.saiu para correr ao fundo. Depois de desligar o terminal, o processo ainda está em execução. Qual é a diferença entre eles?

nohup pega o desligamento do sinal (ver man 7 signal), enquanto que o comercial não (exceto o shell é confgured que forma ou de não enviar SIGHUP todos).,

normalmente, ao executar um comando usando &e ao sair da linha de comandos depois, a linha de comandos terminará o Sub-comando com o sinal de suspensão (kill -SIGHUP <pid>). Isto pode ser evitado usando nohup, como ele pega o sinal e ignora-o de modo que ele nunca chega à aplicação real.

no caso de estar a usar o bash, pode usar o comando para descobrir se a sua shell envia o SIGHUP aos seus processos filhos ou não. Se estiver desligado, os processos não serão terminados, como parece ser o caso para você., Mais informações sobre como bash termina aplicações podem ser encontradas aqui.

Há casos em que nohup não funciona, por exemplo, quando o processo inicia reconecta o SIGHUP sinal, como é o caso aqui.

Tópicos Avançados

trabalhos existentes, processos

algumas conchas (por exemplo, bash) fornecem uma construção de conchas que podem ser usadas para evitar que o AVISTUP seja enviado ou propagado para trabalhos existentes, mesmo que não tenham sido iniciados com nohup., No bash, isto pode ser obtido através de disown -h job; usando o mesmo builtin sem argumentos remove o trabalho a partir do trabalho de tabela, o que também implica que o trabalho não irá receber o sinal. Antes de usar em uma tarefa ativa, ele deve ser parado por Ctrl-Z, e continuado em segundo plano pelo comando bg. Outra opção bash relevante é shopt huponexit, que envia automaticamente o sinal HUP para as tarefas quando a shell está saindo normalmente.,

as versões AIX e Solaris do nohup têm uma opção -p que modifica um processo em execução para ignorar futuros sinais SIGHUP. Ao contrário do descrito acima disown builtin of bash,nohup -p aceita IDs de processo.

ultrapassar a suspensão

Note que as tarefas sobrepostas são normalmente usadas para evitar terminá-las ao iniciar sessão SSH remota. Uma questão diferente que muitas vezes surge nesta situação é que o ssh está se recusando a se desligar (“hangs”), uma vez que ele se recusa a perder quaisquer dados de/para o(s) Trabalho (s) de fundo., Este problema também pode ser superado redirecionando todos os três fluxos I/O:

$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &

também note que uma sessão SSH de fechamento nem sempre envia um sinal HUP para processos dependendo. Entre outros, isso depende se um pseudo-terminal foi alocado ou não.

Alternativas

multiplexador de Terminal

Um multiplexador de terminal pode executar um comando em uma sessão separada, separada da corrente de terminal, o que significa que, se terminar a sessão atual, a sessão desanexado e seus processos associados mantém em execução. Pode-se então voltar à sessão mais tarde.,

Por exemplo, a seguinte invocação de tela será executado somescript.sh no fundo de uma moradia de sessão:

screen -A -m -d -S somename ./somescript.sh &

renegar comando

A renegar comando é usado para remover os trabalhos de tabela de trabalho, ou para marcar trabalhos, de modo que um sinal SIGHUP não é enviado na sessão de encerramento.

Aqui está como você pode tentar:

$ pullftp.sh &$ disown -h$ exit

da página de homem bash bash(1):

por omissão, remove cada argumento do JOBSPEC da tabela de Tarefas activas., Se a opção-h é dada, o trabalho não é removido da tabela, mas é marcado de modo que SIGHUP não é enviado para o trabalho se o shell recebe um SIGHUP. A opção-a, quando o JOBSPEC não é fornecido, significa remover todas as tarefas da tabela de tarefas; a opção-r significa remover apenas as tarefas em execução.

no comando

pode usar no comando para colocar uma tarefa na fila para execução posterior. Por exemplo, você pode executar pullftp.sh script to queue (um minuto) execução posterior:

$ echo "pullftp.sh" | at now + 1 minute

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *