$ systemd-run sleep 1000
Running as unit: run-u635.service
수면 프로세스를 종료하거나 다음을 사용하여 서비스를 올바르게 종료하는 경우에도:
$ systemctl kill run-u635.service
프로세스가 종료되었는지 또는 정상적으로 종료되었는지 알려주는 장치의 속성을 찾을 수 없습니다. 예를 들어.
$ systemctl show --property=ExecMainStatus run-u635.service
ExecMainStatus=0
정상적으로 종료된 서비스와 종료되거나 충돌한 서비스의 차이점을 어떻게 알 수 있나요?
답변1
--service-type=oneshot
( ) 로 서비스를 실행하면 Type=oneshot
종료가 SIGTERM
실패한 것으로 간주됩니다.
이는 실제로 이와 같은 셸 명령이나 셸 스크립트를 실행하는 일반적인 유형의 서비스입니다. (일반적으로 "영원히" 또는 적어도 시스템이 종료될 때까지 실행되는 "데몬"과 반대입니다.) 명령이 실행되면 서비스가 "시작됨" 대신 "시작 중"으로 표시됩니다. --remain-after-exit
( )를 사용 하면 명령이 완료된 시간 RemainAfterExit=yes
으로 표시됩니다 . started
그렇지 않으면 stopped
명령이 완료될 때까지 고려되지 않습니다. "일시적" 유닛을 생성 중이므로 정지하면 사라집니다.
systemd-run이 명령이 완료될 때까지 기다리지 않아서 다행입니다. (이를 사용하면 --wait
종료 명령이 표시되는 것으로 나타났습니다 SIGKILL
). 이 경우 다음과 같은 명령을 사용할 수 있습니다.
systemd-run --service-type=oneshot --no-block sleep 1000
오류가 발생하면 로그 메시지에 표시됩니다. Journalctl을 사용하여 볼 수 있습니다. 예를 들어:
journalctl -b -u run-u635.service
이 방법을 스크립트에서 사용하려고 하면 원하는 대로 잘 작동하지 않는 것 같습니다. 아마도 더 나은 기능 조합을 사용할 수 있을 것입니다. 달성하려는 목표에 대해 더 많이 아는 것이 중요하다고 생각합니다.
systemd-run --user ...
사용자 단위( )를 사용하는 경우 이전 로그인 세션에서 다른 인스턴스가 발생할 수 있다는 우려가 있습니다 .run-u635.service
여기에 있는 문서는 적어도 내 시스템에서는 불완전한 것 같습니다. 문서에는 man systemd.service
동작을 변경할 가능성이 언급되지 않은 것 같습니다 SIGTERM
. 내가 특히 주목한 정의에는 SuccessExitStatus=
이러한 가능성에 대한 언급이 없습니다.
일반적으로 systemd는 서비스가 SIGTERM을 포착한다고 가정하지 않습니다. 일부 서비스는 종료 요청 시 어떠한 조치도 수행할 필요가 없을 수 있습니다. 따라서 정상적으로 존재하는 서비스는 WTERMSIG() == SIGTERM
비정상적으로 종료된 것으로 기록되지 않습니다. (실제로,역사적인 장소systemd 문서에 따르면 SIGTERM을 사용하여 서비스를 종료하면 해당 서비스가 종료 WTERMSIG() == SIGTERM
되더라도 종료되어야 합니다.했다캡처 신호).
이것은 놀랍게 들릴 수도 있습니다. 기억하세요, Unix와 Linux는 수십 년 동안 사용되어 왔습니다.아니요모든 서비스 감독. 서비스의 종료 상태는 모니터링되지 않으므로 SIGTERM
정상적으로 중지해도 일부 서비스는 여전히 살아 있는 것이 거의 확실합니다 .
서비스가 종료된 후에는 사용할 수 없는 상태입니다.
Unit run-u635.service could not be found.
옳은. 사실은systemctl show
등장이 경우에는 작동합니다. 혼란스러운 예입니다 systemctl show
. :-(. 실제로 존재하지 않는 서비스의 속성(현재 로드되지 않은 서비스도 포함)을 쿼리하려고 하면 오류 메시지가 없습니다. 속성을 제외한 기본/빈 속성 값이 표시됩니다 LoadState
. 이것이 제공하는 유일한 단서입니다.
$ systemctl show --property=LoadState run-u635.service
LoadState=not-found