"systemctl stop"과 "systemctl Kill"의 차이점은 무엇입니까?

"systemctl stop"과 "systemctl Kill"의 차이점은 무엇입니까?

systemctl stop이들그리고 그리고 의 차이점은 무엇인가요 systemctl kill?

systemctl kill-9(SIGTERM) 대신 (SIGKILL) 과 같은 프로세스에 사용자 정의 신호 전송을 지원합니다 -15. 그렇다면 항상 (SIGTERM)을 보내는 systemctl kill보다 일반적인 버전의 유일한 차이점은 무엇입니까 ?systemctl stopsystemctl stop-15

예를 들어 systemctl stop( )와 같은 결과는 다음과 같습니다 systemctl kill.ssh.servicesshd

systemctl stop:

$ systemctl stop sshd
$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Mon 2021-11-08 09:09:32 CET; 1s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 2086153 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
  Process: 2086154 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/SUCCESS)
 Main PID: 2086154 (code=exited, status=0/SUCCESS)

systemctl kill:

$ systemctl kill sshd
$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Mon 2021-11-08 09:10:15 CET; 1s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 2086486 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
  Process: 2086487 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/SUCCESS)
 Main PID: 2086487 (code=exited, status=0/SUCCESS)

답변1

systemctl kill매우 유사하며 kill단지 신호만 보냅니다(기본값=SIGTERM). kill와 의 주요 차이점 systemctl kill은 PID 대신 단위를 지정할 수 있으며 systemd는 해당 신호를 보내려는 프로세스를 이해한다는 것입니다.

반면에 systemctl stop명령줄에 지정된 장치는 중지됩니다. systemd모든 ExecStop=행(있는 경우)이 먼저 실행됩니다. 프로세스가 남아 있으면 KillMode=규칙을 사용하여 처리합니다. 그 후에는 전송됩니다 SIGTERM(변경 가능 KillSignal=). 설정 되면 SendSIGHUP=즉시 SIGHUP을 보냅니다. 프로세스가 SIGTERM을 제대로 처리하지 못하고 90초 이내에 중지하지 못하는 경우 TimeoutStopSec=SIGKILL(변경 가능)을 보냅니다(변경 가능 ) FinalKillSignal=. 또한 KillMode=control-group(기본값)이면 모든 하위 프로세스도 종료됩니다.

systemctl kill그래서 이것이 단지 신호를 보내는 것임을 알 수 있습니다 . 이로 인해 장치가 중지될 수 있지만 systemd는 이러한 일이 발생하도록 보장하지 않습니다. 대신 systemctl stop한 장치가 중지됩니다.


systemctl kill다음을 가정하는 것과 동일합니다 systemctl stop.

  1. 아니요ExecStop=
  2. KillSignal=유닛 파일의 --signal=.
  3. 장치는 첫 번째 신호(멈추지 않음)에 대한 응답이 보장되며 후속 작업이 필요하지 않습니다.
  4. KillMode=설정되지 않았거나 와 같습니다 process.

sshd.service의 특별한 점은 다음을 포함한다는 것입니다.

ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID

이 경우 다음과 같이 질문할 수 있습니다. 이 두 명령의 차이점은 무엇입니까?

# systemctl reload sshd
# systemctl kill --signal=SIGHUP --kill-who=sshd.service

거의 동일하지만 차이점은 매우 분명합니다. 신호 전에 호출됩니다 reload./usr/sbin/sshd -t


sshd.service의 또 다른 특별한 점은 고아 프로세스가 systemd에 의해 정리되지 않기 때문에 더 가까워지고 더 가까워진다는 것 KillMode=process입니다 . 기본적으로 systemd는 고아가 된 모든 하위 프로세스를 정리합니다.systemctl killsystemctl stopKillMode=control-group

답변2

매뉴얼에 따르면 kill:

killPATTERN...
하나 이상의 신호를 보냅니다.프로세스단위. --kill-who=종료할 프로세스를 선택하는 데 사용됩니다 . --signal=전송할 신호를 선택하는 데 사용됩니다 .

그리고 stop:

stop모드...
하나 이상을 중지(비활성화)합니다.단위명령줄에 지정됩니다.

따라서 kill특정 유닛의 프로세스가 종료되고 stop해당 유닛이 중지됩니다.

여기서 차이점을 확인할 수 있습니다.

# 프로세스가 종료되지 않습니다.
$ sudo systemctl kill ufw
$ sudo systemctl 상태 ufw
● ufw.service - 단순 방화벽
     로드됨: 로드됨(/lib/systemd/system/ufw.service; 활성화됨, 공급업체 기본값: 활성화됨)
     활성: 활성(종료)2021-11-08 월요일 05:47:44 -03 18초 전 이후;
       문서: 사람: ufw(8)
    프로세스: 48409 ExecStart=/lib/ufw/ufw-init가 자동으로 시작되었습니다(코드=종료, 상태=0/SUCCESS).
   마스터 PID: 48409(코드=종료, 상태=0/성공)

$ sudo ufw 상태
상태: 활성

하스터 작전
----- ------ -----
80 어디든 허용                  
...           

$ sudo systemctl 재시작 ufw
$ sudo systemctl 중지 ufw
$ sudo systemctl 상태 ufw
● ufw.service - 단순 방화벽
     로드됨: 로드됨(/lib/systemd/system/ufw.service; 활성화됨, 공급업체 기본값: 활성화됨)
     활성: 비활성(죽음)2021-11-08 월요일 05:49:08 -03 1초 전 이후;
       문서: 사람: ufw(8)
    프로세스: 48785 ExecStart=/lib/ufw/ufw-init가 자동으로 시작되었습니다(코드=종료, 상태=0/SUCCESS)
    프로세스: 48995 ExecStop=/lib/ufw/ufw-init 중지(코드=종료, 상태=0/성공)
   마스터 PID: 48785(코드=종료, 상태=0/성공)
$ sudo ufw 상태
상태: 비활성

관련 정보