현재 두 개의 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.socket
PartOf=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