DEV Community

Cover image for Execute processos no linux sem interrupções com o nohup
Natanael Alves
Natanael Alves

Posted on

Execute processos no linux sem interrupções com o nohup

Relato
Certo dia, já próximo ao fim do expediente, chegou uma demanda de um cliente solicitando o backup de 4 anos de dados dele registrados em um dos sistemas da empresa. Inicialmente, pensei em gerar um dump dos dados das tabelas e estava funcionando bem, exceto, pelo fato de que estava demorando muito pra terminar o processo e eu precisava ir embora, mas no outro dia esse backup devia ser entregue sem falta. E fui para resolver isso que encontrei o comando nohup.

O que é o nohup?
É um comando no Linux que permite que você execute processos sem encerrá-los quando você fecha o terminal ou faz logout - o que era meu caso, pois estava acessando o servidor via SSH.

Sintaxe

nohup [seu comando] &
Enter fullscreen mode Exit fullscreen mode

O nohup joga o comando para segundo plano e o & joga a execução do nohup para segundo plano para liberar seu terminal. O output e os erros do seu comando, por padrão, vão ser escritos num arquivo chamado nohup.out no diretório atual; porém, você pode especificar arquivos diferentes - veremos em frente.

Caso de uso
No meu caso, era um projeto Laravel e que criei um comando artisan para gerar o backup do cliente. Então, acessei o servidor via SSH, executei meu comando artisan com o nohup e fechei a sessão. Ficou assim:

nohup php artisan generateClientBackup &
Enter fullscreen mode Exit fullscreen mode

Output do comando
Meu comando mostrava no terminal quando terminava o dump de uma tabela, mas, como estava em segundo plano, eu perdia esse feedback. Pra resolver isso, eu redirecionei esses outputs do comando para um arquivo específico e o comando ficou o seguinte:

nohup php artisan generateClientBackup > output.log 2>$1 &
Enter fullscreen mode Exit fullscreen mode

Obs.: em alguns caso, o comando podia dar erro e eu precisava desse feedback também. Então, mandei que os erros fossem para output.log usando 2>$1, onde "2" representa a saída de erro e "$1" representa o arquivo output.log - mas pode-se especificar um nome para o arquivo de erro trocando $1 pelo nome do arquivo.

Cancelar processo em segundo plano
Se por algum motivo você precisar cancelar o processo depois de ter executado, pode usar o comando kill informando o PID (Process ID) do processo:

  1. Obtém o ID do processo:
ps aux | grep [seu comando]
Enter fullscreen mode Exit fullscreen mode
  1. Depois de encontrar o PID, use o comando:
kill [PID]
Enter fullscreen mode Exit fullscreen mode

Bônus: seu comando espera um prompt?

echo "valor_que_voce_quer_informar" | nohup php artisan blablabla > output.log 2>&1 &

Enter fullscreen mode Exit fullscreen mode

O valor escrito pelo comando echo serve como valor padrão para o prompt solicitado pelo seu comando.

Conclusão
Com isso, você pode executar processos demorados sem precisar se preocupar em deixar seu terminal aberto o tempo todo. Mas ainda assim tem que ficar de olho se seu comando não retornou algum erro. Espero que tenham gostado dessa e até a próxima.

Top comments (0)