systemctl stop
일부 하위 명령을 사용하여 쉘 스크립트를 실행 하려고 합니다 . 그러나 쉘 스크립트는 여러 신호를 트랩하므로 스크립트 자체는 SIGTERM에서 중지되지 않으며 systemd는 SIGKILL을 사용하여 90초 대기 기간 후에 프로세스를 중지합니다. 나는 그것을 이해할 수 있습니다: trap
자식이 종료된 후에만 실행하십시오.
systemctl stop
이제 왜 아이들에게 전송되지 않는지 이해하려고 노력하고 있습니다 SIGTERM
. man systemd.kill
말해 주세요장치가 중지되면 장치 제어 그룹의 나머지 모든 프로세스가 종료됩니다(서비스의 경우: ExecStop=으로 구성된 대로 중지 명령을 실행한 후)..
내 문제의 기본 예는 다음과 같습니다. 시스템 단위 파일을 호출하겠습니다 unitdemo
.
[Unit]
Description=test
After=graphical.target systemd-user-sessions.service
[Service]
User=ubuntu
WorkingDirectory=~
PAMName=login
UnsetEnvironment=TERM
StandardOutput=journal
ExecStart=/tmp/mainscript
Restart=always
[Install]
WantedBy=graphical.target
주요 스크립트:
#!/bin/bash
function trapme() {
echo SIGTERM sent to main script, trapped but exiting now...
exit 0
}
echo starting main script
trap trapme SIGTERM
echo now starting child script /tmp/childscript
/tmp/childscript
echo child script exited...
아래첨자도 있습니다:
#!/bin/bash
function trapme() {
echo childscript has been killed by SIGTERM...
exit 0
}
trap trapme SIGTERM
while true; do sleep 1; done
게시는 systemctl stop unitdemo
90초의 대기 시간 이후에만 중지되며 SIGTERM
하위 스크립트로 전송되지 않습니다. 로그에 "childscript가 종료되었습니다..."라는 메시지가 없습니다.
편집하다 man systemd.exec
더 많은 정보가 있습니다. 아래 PAMName
항목이 있습니다 .
Note that when this option is used for a unit it is very likely
(depending on PAM configuration) that the main unit process will be
migrated to its own session scope unit when it is activated. This
process will hence be associated with two units: the unit it was
originally started from (and for which PAMName= was configured),
and the session scope unit. Any child processes of that process
will however be associated with the session scope unit only.
이것은 아이들이 수신되지 않는 이유를 설명합니다 SIGTERM
. 이제 질문은 이 세션을 종료하는 방법입니다. 즉, 나 지금 시작 중이야제공하다, 하지만 그것은회의그리고 서비스를 중지해도 세션은 중지되지 않습니다.
그런데, 다음을 사용하여 첨자를 중지하는 방법을 찾았습니다.
trap "kill \`cat $xkillerfile\`; ..... "
/tmp/childscript &
echo $! > $killerfile
wait
…하지만 기분이 좋지 않습니다. 기본 프로세스가 중지되면 systemd
세션에서 PID를 중지하여 세션을 종료할 수 있는 방법이 있습니까? 그렇다면 어떻게 해야 할까요?
답변1
이 문제는 Systemd 장치에 다음과 같은 설정이 있는 경우 발생합니다.
KillMode=mixed
또는
KillMode=process
질문에 표시한 코드에 그러한 항목이 포함되어 있지 않기 때문에 이것은 이상합니다. 기본값은
KillMode=control-group
그러나 이 기본 설정을 이 [Service]
섹션에 추가할 수 있습니다. 이 작업(및 명백한 작업 systemctl daemon-reload
)을 수행하기 전에 이 설정의 상태를 확인할 수 있습니다.
systemctl show unitdemo | grep -i KillMode