Por que você precisa do screen / tmux para manter um programa remoto rodando?

1

Quando ssh para um servidor e inicio um script que deve ser executado por vários dias, ele para de executar algum tempo depois que eu fizer logoff. Por quê? Suponho que o servidor funcione 24/7.

E o que o screen / tmux faz para evitar que isso aconteça?

    
por The Unfun Cat 09.12.2013 / 22:02

2 respostas

3

Do ponto de vista de um sistema operacional, todo programa em execução é um processo. Quando o kernel é iniciado, ele inicia um processo, principalmente init . Se é SYSV init ou systemd não é relevante para esta discussão, um processo é iniciado. Todos os outros programas são iniciados por outro processo. Isso cria um relacionamento entre os processos, o processo inicial (a.k.a. "pai") e o processo iniciado (a.k.a. "filho"). O kernel está ciente dessas relações.

Quando um processo sai no Linux / Unix, o kernel envia para todos os seus processos filhos o número de sinal 15 (SIGTERM). Ele pode ser capturado pelo processo e o processo deve fazer o que for preciso para sair de forma segura. Você também deve saber o número do sinal 9 (SIGKILL). Este sinal não pode ser capturado pelo processo: o kernel pára o processo sozinho.

Veja este pstree :

init─┬─acpid
     ├─atd
     ├─cron
     ├─dbus-daemon
     ├─dhclient
     ├─dhcpd
     ├─exim4
     ├─6*[getty]
     ├─lwresd───6*[{lwresd}]
     ├─named───6*[{named}]
     ├─nmbd
     ├─portmap
     ├─rpc.statd
     ├─rsyslogd───2*[{rsyslogd}]
     ├─smbd───2*[smbd]
     ├─sshd───sshd───bash───screen───screen───bash───pstree
     └─udevd───2*[udevd]

Você pode ver que pstree é um processo filho de bash e bash um processo filho de screen . Quando saio da máquina, o bash após sshd sai e o kernel envia um sinal 15 para o processo filho screen . MAS, screen não reage a isso. Portanto, o novo processo pai de screen é agora o processo número 1 ( init ). Veja neste pstree :

init─┬─acpid
     ├─atd
     ├─cron
     ├─dbus-daemon
     ├─dhclient
     ├─dhcpd
     ├─exim4
     ├─6*[getty]
     ├─lwresd───6*[{lwresd}]
     ├─named───6*[{named}]
     ├─nmbd
     ├─portmap
     ├─rpc.statd
     ├─rsyslogd───3*[{rsyslogd}]
     ├─screen───bash
     ├─smbd───2*[smbd]
     ├─sshd───sshd───bash───pstree
     └─udevd───2*[udevd]

Na verdade, é isso que acontece quando você desanexa o screen ( ctrl + a - d ). Portanto, todos os subprocessos de screen continuarão sendo executados após a desconexão ou desanexação de screen . Quando você executa um processo sem screen ou tmux , ele recebe um sinal SIGTERM.

    
por 09.12.2013 / 22:19
4

Você precisa usar o comando nohup. Uma explicação é fornecida aqui . Basicamente, ele desanexa o programa que você está executando da sua sessão de terminal, ele é fechado e o programa não morre com seu pai. O tmux e o screen também desanexam os programas que executam e é por isso que você tem o mesmo comportamento.

    
por 09.12.2013 / 22:06