Quais configurações do servidor linux permitem que meus processos de longa execução continuem em execução depois que o terminal é fechado / finalizado?

1

Em trabalhos e experiências anteriores, usei tela ou nohup para executar meus trabalhos de longa duração na tela do meu terminal. A maioria, se não todos os servidores dos meus empregos anteriores, o abandonaram se ele não detectasse nenhuma atividade após um período de tempo X. Mesmo se eu tivesse configurado o ServerKeepAlive e outras configurações no meu arquivo .ssh / config, em alguns casos eu ainda teria inicializado, provavelmente porque o servidor ignorava minhas configurações. Eu usei nohup uma ou duas vezes, mas eu uso principalmente a tela para manter o processo em execução.

Ontem, esqueci de executar meu comando com screen ou nohup. Eu fui expulso e pensei que tinha sido lavado. No entanto, por algum motivo, o processo ainda estava em execução, mesmo depois de várias horas. Eu digitei ps -ef | grep myprocname e estava lá até que fosse concluído. Eu não executei meu processo em segundo plano (não tenho certeza se isso faz diferença). Eu apenas digito ./script.sh e deixo rodar.

Qual configuração no servidor permitiu que esse evento fortuito ocorresse? Eu acho que o servidor remoto está executando o Centos 6.4. Isso é uma coisa Centos 6.4, para não terminar processos quando o processo pai (neste caso minha conexão / shell ssh) é morto? Preciso voltar a ler um livro do Unix / Linux, já que essa é uma pergunta fácil? Eu tenho meus fatos básicos do Unix errados (sobre o processo pai)? Eu tive sorte?

    
por Classified 21.01.2014 / 20:52

1 resposta

2

Isso não responderá à sua pergunta em particular, mas trará algumas informações gerais sobre o comportamento do sistema relevantes para o seu problema e poderá ajudar a entender como controlar melhor o que está acontecendo.

Em sistemas UNIX e UNIX, processos iniciados dentro de um shell serão processos filhos desse shell. Se um shell fecha (por exemplo, desconectando) ou morre, seus processos filhos receberão um sinal de desconfiguração (SIGHUP) e os processos filhos serão herdados por init , o primeiro processo, e assim terão os processos pai daemonizados como pid 1 .

A criança pode implementar um manipulador e pode ser decidido de forma programática qual ação tomar. Normalmente, a criança vai desistir de desligar a casca das cascas.

Para evitar isso ou tomar uma ação diferente, você pode usar um manipulador de sinal (consulte armadilha no bash):

#!/bin/bash

trap '' HUP

# some long running action here

Isto irá ignorar o sinal HUP. Você pode adicionar algumas operações assim:

#!/bin/bash

on_hangup() {
    echo "Cought SIGHUP"
    # more commands/action
    # like redirection stdout to preserve output
    # or exit
}

trap 'on_hangup' HUP

# long running stuff here
    
por 22.01.2014 / 11:05