내가 지금 일하고있는 회사에는 레거시 서비스가 있으며 그 초기 스크립트는 오래된 SysvInit를 사용하지만 시스템을 통해 실행됩니다 (CentOS 7).
많은 계산이 있기 때문에이 서비스는 완료하는 데 약 70 초가 걸립니다. systemd에 대한 시간 초과를 구성하지 않았고에서 기본 구성을 변경하지 /etc/systemd/system.conf
않았지만 여전히 service SERVICE stop
서비스를 실행할 때 60 초 후에 시간이 초과됩니다.
확인 후이 journalctl -b -u SERVICE.service
로그를 찾습니다.
Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]
DefaultTimeoutStopSec
속성을에서 (으) /etc/systemd/system.conf
로 변경하려고 시도 90s
했지만 시간 초과가 계속 발생합니다.
왜 60 초에 시간이 초과되는지 아는 사람이 있습니까? 이 시간 초과 값이 구성된 다른 곳이 있습니까? 확인할 수있는 방법이 있습니까?
이 서비스는 java 7과 함께 실행되며 데몬을 시작 하기 위해 JSVC를 사용 합니다 . -wait
매개 변수를 값으로 구성했습니다 120
.
답변
내 시스템 서비스는 부팅하는 데 시간이 오래 걸리기 때문에 시간이 초과되어 계속 수정되었습니다.
- 시스템 파일을 편집하십시오.
- 최신 버전의 경우
systemd
: 실행하십시오systemctl edit --full node.service
( “node”를 서비스 이름으로 바꾸십시오 ).- 에 시스템 파일을
/etc/systemd/system/node.service.d/
덮어 쓰는 시스템 파일이 생성 됩니다/usr/lib/systemd/system/node.service
. 이것이 시스템 파일을 구성하는 올바른 방법입니다. 사용 방법에 대한 자세한 내용systemctl edit
은 여기를 참조하십시오 .
- 에 시스템 파일을
- 직접 시스템 파일 편집 : 시스템 파일이 있습니다
/usr/lib/systemd/system/node.service
. “node”를 응용 프로그램 이름으로 바꾸십시오. 그러나 파일을 직접 편집하는 것은 안전하지 않습니다/usr/lib/systemd/
(의견 참조).
- 최신 버전의 경우
-
사용
TimeoutStartSec
,TimeoutStopSec
또는TimeoutSec
(추가 정보를 원하시면 여기는 ) 타임 아웃이 시작 및 프로세스를 정지해야하는 시간을 지정합니다. 그 후 이것은 내 시스템 파일이 어떻게 보이는지입니다.[Unit] Description=MyProject Documentation=man:node(1) After=rc-local.service [Service] WorkingDirectory=/home/myproject/GUIServer/Server/ Environment="NODE_PATH=/usr/lib/node_modules" ExecStart=-/usr/bin/node Index.js Type=simple Restart=always KillMode=process TimeoutSec=900 [Install] WantedBy=multi-user.target
- 다음 중 하나를 실행하여 현재 시간 초과 상태를 볼 수도 있습니다 (그러나 변경하려면 서비스를 편집해야합니다! 1 단계 참조).
systemctl show node.service -p TimeoutStartSec
systemctl show node.service -p TimeoutStopSec
systemctl show node.service -p TimeoutSec
- 다음 중 하나를 실행하여 현재 시간 초과 상태를 볼 수도 있습니다 (그러나 변경하려면 서비스를 편집해야합니다! 1 단계 참조).
- 다음으로 시스템을 다시로드해야합니다.
systemctl reload node.service
- 이제 서비스를 시작하십시오
systemctl start node.service
- 그래도 작동하지 않으면 다음과 같이 systemctl을 재부팅하십시오.
systemctl reboot
- 그래도 작동하지 않으면
--no-block
systemctl 옵션을 다음과 같이 사용해보십시오systemctl --no-block start node.service
. 이 옵션에 대한 설명은 다음과 같습니다 . “요청 된 작업이 완료 될 때까지 동 기적으로 기다리지 마십시오.이를 지정하지 않으면 작업이 확인되고 큐에 대기되고 systemctl은 장치의 시작이 완료 될 때까지 대기합니다.이 인수를 전달하면 “확인되고 대기열에 추가됩니다.”
댓글 업데이트 :
TimeoutSec=infinity
: 여기서 “무한”을 사용하는 대신TimeoutSec=900
(15 분) 과 같이 많은 시간을 투자하십시오 . 응용 프로그램이 “영원히”종료되는 경우 재부팅을 무기한 차단할 수 있습니다. 크레딧 @Alexis Wilke 및 @JCCyC- 편집
/usr/lib/systemd/system
하는systemctl edit
대신 대신 또는 수정/etc/systemd/system
을 시도 하여 재정의하십시오. 에서 서비스 파일을 편집해서는 안됩니다/usr/lib/
. 크레딧 @ryeager 및 @ 0xC0000022L
답변
실행 systemctl show SERVICE_NAME.service -p TimeoutStopUSec
중 적어도 systemd가 내 서비스에 설정 한 시간 초과를 볼 수있었습니다.
제대로 작동하기 위해 스크립트를 일반 단위 파일로 변경했습니다.