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.

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Eliminate Context Switching and Maximize Productivity

Pieces.app

Pieces Copilot is your personalized workflow assistant, working alongside your favorite apps. Ask questions about entire repositories, generate contextualized code, save and reuse useful snippets, and streamline your development process.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay