단위 파일 없이 시스템 서비스를 중지하는 방법

단위 파일 없이 시스템 서비스를 중지하는 방법

Systemd는 고아 프로세스를 상속할 수 있으며 특정 서비스에 대한 단위 파일 없이 서비스를 실행하는 다른 방법이 있습니다. 재시작 또는 중지가 실행될 때 서비스 정의 없이 서비스의 전체 내용이 무엇인지 알고 싶습니다.

나는 특히 전송되는 신호 및 시간 초과에 관심이 있습니다. 즉, systemd는 서비스 이름의 사전순으로 나머지 모든 서비스에 sigterm을 보내고 30초 후에 나머지 서비스에 sigkill을 발행합니다. (이게 맞는지는 모르겠지만 제가 관심을 갖고 있는 정보 유형은 이렇습니다.)

또한 이것이 어디에 구성되고 문서화되어 있는지 알고 싶습니다.

답변1

소스 코드와 매뉴얼 페이지를 잠깐 살펴보았는데 간단한 대답은 다음과 같습니다.

TimeoutStopSec= Configures the time to wait for stop. If a service is asked to stop, but does not terminate in the specified time, it will be terminated forcibly via SIGTERM, and after another timeout of equal duration with SIGKILL (see KillMode= in systemd.kill(5)). Takes a unit-less value in seconds, or a time span value such as "5min 20s". Pass "0" to disable the timeout logic. Defaults to DefaultTimeoutStopSec= from the manager configuration file (see systemd-system.conf(5)).

그래서 /etc/systemd/system.conf를 보고 다음을 발견했습니다.

#DefaultTimeoutStopSec=90s

따라서 systemd 재시작 대상이 발생하면 systemd는 자신이 소유한 하위 프로세스에 대한 pid 세트를 얻습니다. 소스 코드를 보면 systemd/src/core/killall.c는 다음을 나타내는 것 같습니다.

static int killall(int sig, Set *pids, bool send_sighup) 

systemd의 모든 하위 프로세스에 대한 pid 목록을 가져와 다음 방법으로 호출합니다.

broadcast_signal(int sig, bool wait_for_exit, bool send_sighup)

이것은 동일한 파일에 있습니다. 따라서 pid 1의 모든 하위 프로세스는 결국 SIGTERM의 기본 신호를 받게 되며 단위 파일이 없으면 선택적 SIGHUP이 전송되지 않을 수 있으며 구성된 DefaultTimeoutStopSec를 기다린 다음 SIGKILL을 전송한다고 가정합니다.

답변2

나는 다음 프로그램을 작성했습니다.

#! /bin/bash

trap "echo HUP > out.txt; exit 0" HUP
trap "echo INT > out.txt; exit 0" INT
trap "echo TERM > out.txt; exit 0" TERM

while true; do
    date
    sleep 1;
done

그런 다음 백그라운드 프로세스로 실행합니다.

./test.sh &

그런 다음 재부팅합니다.

다음에 시작할 때 "out.txt"의 신호는 다음과 같습니다.

TERM

관련 정보