수동으로 중지된 서비스가 올바르게 중지되지 않음

수동으로 중지된 서비스가 올바르게 중지되지 않음

누군가가 연결을 시도하면 활성화되어야 하는 서버가 있습니다. 이를 위해 시스템 소켓과 서비스를 만들고 서버용 에이전트를 구축한 후 시작했습니다. 감사해요이 튜토리얼별로 어렵지 않습니다.

실행 중인 서버와 통신하기 위해 FIFO 파이프를 만들었고 활성화된 서버가 없으면 서버를 중지하고 싶습니다. 파이프를 통해 서버를 중지하면 Server.service는 일부 loaded deactivating stop상태로 유지되고 Proxy.service는 계속 실행됩니다. (상태: systemctl list-units)

누군가 다시 연결을 시도하면 서비스를 다시 시작하고 싶지만 수동으로 연결하는 경우에만 작동합니다 systemctl stop server.service.


프록시.소켓

[Socket]
ListenStream=25565

[Install]
WantedBy=sockets.target

프록시 서버

[Unit]
Requires=server.service
After=server.service

[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:25555

서버.서비스

[Unit]
Description=my Server

[Service]
User=nonRootUser
ExecStart=/home/nonRootUser/server/startup-fifo.sh
ExecStop=/home/nonRootUser/server/cmd stop

답변1

server.service여러 Type=simple유형(지정된 경우 기본값 ExecStart=).

그것에 관한 ExecStop=흥미로운 이야기가 있습니다문서

ExecStop=에 지정된 명령은 서비스가 처음으로 성공적으로 시작될 때만 실행됩니다. 서비스가 전혀 시작된 적이 없거나 시작이 실패하는 경우(예: ExecStart=, ExecStartPre= 또는 ExecStartPost=에 지정된 명령이 실패했기 때문에) 호출되지 않습니다("-" 접두사가 붙지 않았습니다. 참조). 위) 또는 시간이 초과되었습니다.. .또한 서비스의 프로세스가 스스로 종료되거나 종료되더라도 서비스가 성공적으로 시작되면 항상 중지 작업이 수행됩니다. 이 상황을 처리하려면 중지 명령을 준비해야 합니다.

server.service귀하의 질문에 따르면 FIFO를 통해 물건을 보내는 대신 "자체"를 종료하는 것처럼 들립니다 . systemd는 이를 확인하고 호출하여 ExecStop보류 중인 추가 FIFO 작업을 수행하여 "비활성화" 동작을 유발할 수 있습니다.

ExecStartExecStop명령이 0 상태로 종료되고 시스템이 서비스를 비활성으로 등록하도록 중단되지 않는지 확인해야 합니다 .

답변2

보기 흉할 수도 있지만 문제를 해결했습니다.

Proxy.service 대신에 Requires=server.serviceProxy.service 를 만들었습니다 BindTo=server.service. 이렇게 하면 server.service가 중지되거나 실패하는 경우 Proxy.service가 올바르게 종료됩니다.

현재 server.service는 loaded deactivating stop어떤 이유로 다시 시작할 수 없는 상태로 계속 실행되고 있습니다. 스크립트가 완료된 후 프로세스가 실패하여 exit 1server.service가 상태로 전환됩니다 loaded failed failed.

Proxy.service에는 여전히 server.service가 필요하므로 다시 시작되고 모든 것이 예상대로 작동합니다.

관련 정보