A reinicialização do serviço envia um HUP?

5

Eu notei que fazer um serviço é reiniciado com algo como:

service sshd restart

é muito semelhante a fazer algo como:

pkill -HUP sshd

No entanto, o pkill fecharia minha sessão ssh onde a reinicialização do serviço deixaria aberta. Isso levou à minha pergunta e isso é que um serviço de reinicialização envia um verdadeiro HUP como o comando pkill? E se eles fizerem a mesma coisa, por que o serviço reiniciar deixará minha sessão ssh aberta, mas o pkill a fechará?

    
por user53029 29.10.2015 / 21:36

4 respostas

4

Em sshd(8) :

 specified in the configuration file.  sshd rereads its configuration file
 when it receives a hangup signal, SIGHUP, by executing itself with the

A diferença entre um script de serviço e um indiscriminado pkill -HUP sshd as root é que o script de serviço segmentará apenas o processo principal sshd , enquanto o pkill obterá esse processo e também qualquer filho sshd processos que foram bifurcados desse pai. Exemplo:

% ps axo pid,ppid,command | grep ssh'[d]'
 1808     1 /usr/sbin/sshd
 8066  1808 sshd: jdoe [priv] (sshd)
28968  8066 sshd: jdoe@ttypj (sshd)
% 

init(8) (pid 1) começou o principal sshd (pid 1808) e que há dois processos child sshd para alguém logado (pids 8066 e 28968). pkill vai para todos eles, enquanto um script de serviço envia apenas o HUP para o pid 1808.

    
por 29.10.2015 / 22:05
3

Não. SIGHUP provavelmente não significa o que você acha que faz.

Nos tempos antigos (e estou falando dos anos 70 aqui), um terminal era um dispositivo que se conectava a uma máquina UNIX por meio de uma linha serial. Isso geralmente era feito por meio de uma conexão de modem, pois, naqueles dias, comprar uma segunda máquina era muito mais caro do que ter que pagar por muita conectividade telefônica; e usando uma linha de modem, você poderia compartilhar uma máquina com alguém distante.

Quando você termina de usar a máquina, é necessário ter certeza de que o que quer que você esteja executando seja interrompido, já que as máquinas não tinham a mesma quantidade de recursos que as máquinas de hoje e, portanto, o sistema Ajudá-lo a garantir que você não se esqueça de fazê-lo enviando um sinal para qualquer processo conectado à sua linha serial quando o modem for desligado. Este foi o sinal 'hangup', cujo nome foi abreviado para SIGHUP .

Em algum momento, alguém descobriu que às vezes fazia sentido ter um processo executado continuamente, de modo a fornecer algum serviço para os usuários na máquina. Para garantir que o processo continuasse funcionando, era necessário que ele fosse desconectado do terminal em que foi iniciado, para que, quando o usuário se desconectasse e o modem desligasse, o processo não fosse resolvido. morto. Além disso, se o processo não se separasse da linha serial, o terminal não seria liberado e o próximo usuário que tentasse usá-lo não seria capaz de fazê-lo. Então, por essas razões, você destaca.

Agora você tem um processo de longa duração que, em algum momento, pode precisar ser reconfigurado. Você poderia reiniciá-lo, ou você poderia fazer o processo pesquisar seu arquivo de configuração de vez em quando. Ambos os recursos de resíduos, no entanto. Seria muito melhor se você pudesse dizer quando reler seu arquivo de configuração. Já que há um sinal que, para um daemon, não tem sentido, por que não reutilizar isso? Certo, então foi isso que aconteceu, e como resultado, uma convenção hoje é, de fato, que os daemons relerem o arquivo de configuração quando receberem SIGHUP .

Mas isso é apenas uma convenção, e não é de modo algum uma regra geral. A finalidade principal e documentada de SIGHUP ainda é sinalizar o fato de que a conexão do terminal foi interrompida. Por esse motivo, a ação padrão para qualquer programa após o recebimento do sinal SIGHUP ainda será encerrada, mesmo que o processo seja um daemon.

Como tal, uma init implementação não pode enviar apenas SIGHUP para processos aleatórios que ela gerencia. Sim, em muitos casos, a ação de recarga acaba enviando SIGHUP para o daemon por meio de qualquer configuração que o sistema init tenha (seja scripts de inicialização, arquivos de unidade do systemd, configuração iniciante ou qualquer outra coisa); mas é incorreto supor que isso é o que sempre acontecerá e, portanto, se também é incorreto dizer que os dois são equivalentes.

Ocasionalmente, isso também explica porque o envio de SIGHUP para um sshd no comando de um terminal mata a sessão; é porque o sshd assume que algo matou a conexão e que, portanto, deve terminar.

    
por 30.10.2015 / 00:02
1

Isso é muito específico do serviço (por isso minha resposta ignora que você mencionou especificamente sshd como o serviço)

Muitos serviços acionam um recarregamento ao receber um SIGHUP , mas eles também podem ignorar o sinal ou finalizar.

Otoh, um serviço geral restart (e às vezes um serviço recarregado ) inclui principalmente desligar o servidor completamente e iniciá-lo novamente (então é frequentemente um atalho para service $SERVICE stop; service $SERVICE start ).

Finalmente, chamar service $SERVICE reload (ou qualquer outro serviço-comando), chamará um script especializado nos bastidores, que tenha um conhecimento a priori sobre o serviço a ser manipulado: então se o serviço em questão quer um SIGHUP para recarregar, o script enviará este sinal; mas pode desencadear outra ação para conseguir o efeito de recarregar)

    
por 29.10.2015 / 22:20
1

Supondo que isso seja sobre upstart , então não, não, pelo menos não no meu sistema.

service é um script de shell que executa initctl , como você pode verificar exibindo which service .

restart mapeia para stop + exec start .

stop envia SIGTERM e possivelmente SIGKILL se o SIGTERM não tiver funcionado dentro de um período de tempo razoável (o mínimo é o que o manual diz).

reload é o que você deseja se quiser enviar um SIGHUP para um serviço iniciante.

    
por 29.10.2015 / 22:23