heldercorreia.com

autodidata, programador e consultor

Deixar um processo a correr

Por vezes queremos deixar correr um programa em SSH mesmo depois de fechar a sessão. Colocar a tarefa em background com o & não vai funcionar. Há quem use o GNU Screen ou o nohup, mas eu prefiro o tmux.

tmux is a terminal multiplexer

What is a terminal multiplexer? It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal. And do a lot more. See the manual.

Eu faço muita coisa com o tmux, incluindo em desenvolvimento, mas este post é sobre um caso de uso específico e vou manter isto simples para ser usado como referência.

Deixar a correr um processo mesmo após o logout

O tmux instala-se com qualquer gestor de pacotes (i.e., apt-get, yum, brew…).

Vamos supor que queremos deixar a correr remotamente o runserver do Django para demonstrar trabalho a um cliente.

# Criamos uma nova sessão com nome "runserver" (pode ser qualquer nome)
$ tmux new -s runserver

# Usar normalmente
$ workon django
(django)$ python manage.py runserver 0.0.0.0:8000

# ^b d (Ctrl+B e depois D, para fazer o detach da sessão)
[detached (from session runserver)]

# Para listar sessões activas
$ tmux ls
runserver: 1 windows (created Mon Nov  3 22:09:53 2014) [85x65]

# Para recuperar a sessão
$ tmux attach -t runserver

# Aparece o output do "manage.py runserver" mesmo enquanto estivemos desligados...

Explicação

Sabemos que estamos numa sessão tmux porque na parte inferior do terminal aparece uma linha com fundo amarelo e alguma informação.

É o detach da sessão que faz com que todos os processos iniciados dentro da mesma, sejam desassociados da sessão actual do SSH. Se não for assim, ao desligar o SSH, todos os processos iniciados lá dentro também fecham.

Tomar atenção à combinação de teclas. O Ctrl+B entra num modo especial de controle do tmux. Dentro desse modo, o D faz o detach. Esta combinação é escrita como ^b d.

Para recuperar a sessão, pode-se usar qualquer computador, ou mais que um ao mesmo tempo (útil para colaborar em tempo real com colegas). Tem é que ser na mesma conta de utilizador que a que foi iniciada a sessão.

Se não for mais precisa a sessão tmux, basta fazer um logout normal (Ctrl+D) lá dentro.

Comentários