ExecStopPost 메서드

ExecStopPost 메서드

현재 두 개의 Fifo 소켓을 사용하여 시스템 서비스를 만들려고 합니다. 이러한 소켓은 애플리케이션의 표준 출력 및 표준 입력에 매핑됩니다. 현재 다음 구성 파일을 사용하고 있습니다.

foo.service

[Unit]
Description=foo Fifo test
After=network.target foo-in.socket foo-out.socket
Requires=foo-in.socket foo-out.socket

[Service]
Sockets=foo-out.socket
Sockets=foo-in.socket
StandardOutput=fd:foo-out.socket
StandardInput=fd:foo-in.socket
StandardError=journal
ExecStart=/path/to/foo/exec

foo-out.socket

[Unit]
Description=foo Task Writes to this

[Socket]
Service=foo.service
ListenFIFO=%t/foo/out

foo-in.socket

[Unit]
Description=foo Task reads commands from this

[Socket]
Service=foo.service
ListenFIFO=/run/user/1000/foo/in

systemctl --user daemon-reload명령을 사용하여 서비스를 시작할 수 있습니다 systemctl --user start foo. foo.service를 중지하려고 하면 문제가 발생합니다. 다음 메시지가 나타납니다.

Warning: Stopping foo.service, but it can still be activated by:
  foo-in.socket
  foo-out.socket

서비스가 중지되면 소켓을 자동으로 중지하는 방법이 있습니까?

답변1

수동으로 끌 수 있는 좋은 예입니다. 여기의 예는 "docker" 서비스를 종료하려고 시도하는 것입니다.

root@localhost:~# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
   docker.socket

root@llocalhost:~# systemctl stop docker.socket

root@logicaldoc:~# ps aux | grep docker
root      1519  0.0  0.0  14220   924 pts/0    S+   17:41   0:00 grep --color=auto docker

답변2

ExecStopPost 메서드

이 블록의 옵션을 사용하면 서비스가 성공적으로 완료된 후 또는 실패로 인해 중지될 때 [Service]임의의 명령을 실행할 수 있습니다.ExecStopPost=

마지막 행만 업데이트됩니다.

[Unit]
Description=foo Fifo test
After=network.target foo-in.socket foo-out.socket
Requires=foo-in.socket foo-out.socket

[Service]
Sockets=foo-out.socket
Sockets=foo-in.socket
StandardOutput=fd:foo-out.socket
StandardInput=fd:foo-in.socket
StandardError=journal
ExecStart=/path/to/foo/exec
ExecStopPost=systemctl --user stop foo-out.socket ; systemctl --user stop foo-in.socket

원천:시스템 서비스(강조는 내 것)

서비스가 중지된 후 실행할 추가 명령입니다. 여기에는 ExecStop=에 구성된 명령이 사용되거나 서비스에 ExecStop=이 정의되어 있지 않거나 서비스가 예기치 않게 종료되는 상황이 포함됩니다. 이 매개변수는 ExecStart=에 대해 설명한 것과 동일한 체계를 따르는 여러 명령줄을 사용합니다. 이러한 설정의 사용은 선택 사항입니다. 지정자 및 환경 변수 대체를 지원합니다.ExecStop=과 달리 이 설정으로 지정된 명령은 서비스가 올바르게 시작되지 않고 다시 종료될 때 호출됩니다.

이 설정은 서비스가 올바르게 시작되지 않는 경우에도 수행해야 하는 정리 작업에 권장됩니다. 이 설정으로 구성된 명령은 서비스가 중간에 시작되지 않고 불완전하게 초기화된 데이터가 남아 있는 경우에도 실행될 수 있어야 합니다. 이 설정으로 지정된 명령이 실행될 때 서비스의 프로세스는 이미 종료되었으므로 해당 프로세스와 통신을 시도해서는 안 됩니다.

이 설정으로 구성된 모든 명령은 $SERVICE_RESULT, $EXIT_CODE 및 $EXIT_STATUS 환경 변수에 설정된 서비스의 결과 코드와 기본 프로세스의 종료 코드 및 상태로 호출됩니다. exec(5) 세부 정보를 참조하세요. .

Before=/After= 순서 제약 조건의 경우 ExecStopPost= 실행이 고려됩니다.

답변3

via에 의해 시작되는 ExecStopPost=/rm (socket pathname)정의에 추가되었습니다 ./etc/systemctl/system/(???).socket(???).service"Requires=???.socket"

소켓을 삭제하려면 서비스를 중지한 다음 소켓도 중지하세요. 소켓을 중지하지 않으면 소켓에 쓰는 모든 클라이언트가 서비스를 중지할 때 나타나는 메시지에 따라 서비스를 다시 활성화합니다.

경고: (???).service를 중지하는 중이지만 다음을 통해 계속 활성화할 수 있습니다: (???).socket

답변4

추가하지는 않겠지만 ExecStopPost=systemctl ...systemd의 사전 정의된 관계에 의존합니다 PartOf=.

~에서매뉴얼 페이지:

   PartOf=
       Configures dependencies similar to Requires=, but limited to stopping and
       restarting of units. When systemd stops or restarts the units listed
       here, the action is propagated to this unit. Note that this is a one-way
       dependency — changes to this unit do not affect the listed units.

       When PartOf=b.service is used on a.service, this dependency will show as
       ConsistsOf=a.service in property listing of b.service.  ConsistsOf=
       dependency cannot be specified directly.

그리고 부품 을 추가할 수 foo-out.socket있습니다 . 그런 다음 중지되면 소켓도 중지됩니다.foo-in.socketPartOf=foo.service[Unit]foo.service


foo.service(손대지 않은)

[Unit]
Description=foo Fifo test
After=network.target foo-in.socket foo-out.socket
Requires=foo-in.socket foo-out.socket

[Service]
Sockets=foo-out.socket
Sockets=foo-in.socket
StandardOutput=fd:foo-out.socket
StandardInput=fd:foo-in.socket
StandardError=journal
ExecStart=/path/to/foo/exec

foo-out.socket

[Unit]
Description=foo Task Writes to this
PartOf=foo.service

[Socket]
Service=foo.service
ListenFIFO=%t/foo/out

foo-in.socket

[Unit]
Description=foo Task reads commands from this
PartOf=foo.service

[Socket]
Service=foo.service
ListenFIFO=/run/user/1000/foo/in

관련 정보