서비스가 다시 시작되면 HUP가 전송되나요?

서비스가 다시 시작되면 HUP가 전송되나요?

다음과 같이 서비스를 다시 시작하는 것을 확인했습니다.

service sshd restart

다음을 수행하는 것과 매우 유사합니다.

pkill -HUP sshd

그러나 pkill은 내 SSH 세션을 닫고 서비스를 다시 시작하면 해당 세션이 열린 상태로 유지됩니다. 내 질문이 있습니다. 서비스를 다시 시작하면 pkill 명령처럼 실제 HUP가 전송됩니까? 동일한 작업을 수행하는 경우 서비스를 다시 시작하면 SSH 세션이 열린 상태로 유지되지만 pkill은 이를 닫는 이유는 무엇입니까?

답변1

아니요 SIGHUP, 아마도 당신이 생각하는 방식이 아닐 것입니다.

예전(1970년대)에 터미널은 직렬 회선을 통해 UNIX 시스템에 연결된 장치였습니다. 당시에는 대형 전화 연결 비용을 지불하는 것보다 두 번째 컴퓨터를 구입하는 것이 더 비쌌기 때문에 모뎀 회선을 사용하면 멀리 있는 사람들과 컴퓨터를 공유할 수 있었습니다.

기계 작업이 끝나면 실행 중인 모든 작업이 중지되었는지 확인하는 것이 매우 필요합니다. 왜냐하면 당시 기계에는 오늘날 기계가 가지고 있는 것과 같은 양의 리소스가 없었기 때문입니다. 모뎀이 끊기면 직렬 회선에 연결된 프로세스에 신호를 보내 이를 수행하는 것을 잊지 마십시오. 이것은 "hang up" 신호이며, 그 이름은 로 축약됩니다 SIGHUP.

어느 시점에서 누군가는 컴퓨터의 사용자에게 일부 서비스를 제공하기 위해 프로세스를 지속적으로 실행하는 것이 때때로 합리적이라는 것을 발견했습니다. 프로세스가 계속 실행되도록 하려면 프로세스를 시작한 터미널에서 프로세스를 분리해야 합니다. 그러면 사용자가 연결을 끊고 모뎀이 끊어지면 프로세스가 계속 실행되지 않습니다. 살해당했습니다. 또한 프로세스가 직렬 회선에서 분리되지 않으면 단말기가 해제되지 않으며, 이를 사용하려는 다음 사용자는 사용할 수 없게 됩니다. 그래서 이러한 이유로 당신은 헤어질 것입니다.

이제 어느 시점에서 재구성해야 할 수 있는 장기 실행 프로세스가 생겼습니다. 다시 시작하거나 프로세스가 구성 파일을 자주 폴링하도록 할 수 있습니다. 그러나 둘 다 자원을 낭비합니다. 구성 파일을 언제 다시 읽어야 하는지 알려줄 수 있다면 더 좋을 것입니다. 이 신호는 데몬에게는 의미가 없으므로 재사용하는 것은 어떨까요? 예, 그런 일이 일어났고, 오늘의 컨벤션이 실제로 데몬에 의해 수신되고 있는 것으로 밝혀졌습니다 SIGHUP.

그러나 이는 단지 관례일 뿐 일반적인 법칙은 아닙니다. 문서화된 주요 목적은 SIGHUP터미널 연결이 끊어졌음을 나타내는 것입니다. 따라서 SIGHUP프로세스가 데몬인 경우에도 신호를 수신하면 모든 프로그램의 기본 동작은 여전히 ​​종료됩니다.

따라서 init구현할 수 없다SIGHUP관리하는 임의의 프로세스로 보내면 됩니다 . 예, 대부분의 경우 다시 로드 작업은 SIGHUPinit 시스템의 구성(예: init 스크립트, 시스템 단위 파일, upstart 구성 또는 기타 구성)을 통해 데몬 프로세스로 전송 됩니다 .생각하다이것은 항상 일어나는 일이므로 둘이 동일하다고 말하는 것도 올바르지 않습니다.

때때로 이는 터미널 SIGHUP에 전송된 명령이 세션을 종료하는 이유를 설명하기도 합니다. 이는 sshd가 무언가가 연결을 종료했다고 가정하므로 종료해야 하기 때문입니다.sshd

답변2

~에서sshd(8):

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

pkill -HUP sshd서비스 스크립트와 무차별의 차이점은 root서비스 스크립트는 기본 sshd프로세스만 대상으로 하는 반면, 서비스 스크립트는 해당 프로세스와 해당 상위 프로세스에서 분기된 모든 하위 프로세스를 pkill가져옵니다 . sshd예:

% 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) 기본 프로세스 sshd(pid 1808)가 시작되었으며 sshd로그인한 사용자가 사용할 수 있는 두 개의 하위 프로세스(pid 8066 및 28968)가 있습니다. pkill서비스 스크립트는 HUPPID 1808로만 전송되는 반면, 모든 서비스에 전송됩니다.

답변3

이는 서비스별로 매우 구체적입니다(따라서 내 대답은 sshd귀하가 구체적으로 언급한 서비스를 무시합니다).

많은 서비스가 실행됩니다.새로고침수신되면 SIGHUP신호를 무시하거나 종료할 수도 있습니다.

일반 오토서비스 재시작(가끔서비스 리로드)에는 기본적으로 서버를 완전히 종료하고 다시 시작하는 작업이 포함됩니다(따라서 일반적으로 바로가기 service $SERVICE stop; service $SERVICE start).

마지막으로, 호출 service $SERVICE reload(또는 기타 서비스 명령)은 배후에서 다음과 같은 특수 스크립트를 호출합니다.사전 지식작동할 서비스 정보: 따라서 관련 서비스가 SIGHUP다시 로드하려는 경우 스크립트는 이 신호를 보내지만 다시 로드 효과를 얻기 위해 다른 작업이 트리거될 수 있습니다.

답변4

이것이 에 관한 것이라고 가정 upstart하면, 아니, 적어도 내 시스템에는 없습니다.

serviceinitctl실행 방법을 확인할 수 있는 쉘 스크립트입니다 which service.

restartstop+ 에 매핑됩니다 exec start.

stop전송 되고 합리적인 시간 내에 작동하지 않을 SIGTERM수도 있습니다 (적어도 설명서에는 그렇게 나와 있습니다).SIGKILLSIGTERM

reload신생 서비스를 보내고 싶다면 SIGHUP이것이 바로 당신이 원하는 것입니다.

관련 정보