현재 제가 일하는 회사에는 초기화 스크립트가 이전 SysvInit를 사용하지만 systemd(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
.
답변1
내 systemd 서비스는 시작하는 데 시간이 오래 걸리기 때문에 항상 시간 초과되므로 문제가 해결되었습니다.
시스템 파일을 편집합니다:
- 현대 버전의 경우
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단계 참조). 혼란스럽게도 관련 속성의 이름에는 마이크로초를 나타내는 "U"가 있습니다. 바라보다이 Github 문제더 많은 정보를 알고 싶다면:
systemctl show node.service -p TimeoutStartUSec
systemctl show node.service -p TimeoutStopUSec
systemctl show node.service -p TimeoutUSec
- 또한 다음 중 하나를 실행하여 현재 시간 초과 상태를 확인할 수 있습니다(그러나 변경하려면 서비스를 편집해야 합니다! 1단계 참조). 혼란스럽게도 관련 속성의 이름에는 마이크로초를 나타내는 "U"가 있습니다. 바라보다이 Github 문제더 많은 정보를 알고 싶다면:
다음으로 systemd를 다시 로드해야 합니다.
systemctl reload node.service
이제 서비스를 시작해 보세요
systemctl start node.service
그게 작동하지 않으면, systemctl을 다시 시작해 보세요.
systemctl reboot
그게 작동하지 않으면
--no-block
, 다음과 같이 systemctl 옵션을 사용해 보십시오 .systemctl --no-block start node.service
. 이 옵션에는 설명이 있습니다.여기: "요청된 작업이 완료될 때까지 동기적으로 기다리지 마십시오. 지정하지 않으면 작업이 검증되고 큐에 추가되며 systemctl은 장치 시작이 완료될 때까지 기다립니다. 이 매개변수를 전달하면 검증 및 큐에 넣기만 수행됩니다. ."systemctl mask
대신 사용할 수 있는 옵션도 있습니다systemctl start
. 자세한 내용은 을 참조하세요.여기.
댓글 업데이트:
TimeoutSec=infinity
: 여기서는 "무한대"를 사용하는 대신 긴 시간(예:TimeoutSec=900
15분)을 사용합니다. 응용 프로그램을 종료하는 데 "영구" 시간이 걸리는 경우 다시 시작이 무기한 차단될 수 있습니다. 이미지 출처: @Alexis Wilke 및 @JCCyC/usr/lib/systemd/system
을(를 ) 편집하는 대신systemctl edit
덮어쓰거나 편집해 보십시오/etc/systemd/system
./usr/lib/
@ryeager 및 @0xC0000022L을 편집 해서는 안 됩니다 .
**시스템 소스 문서에서 업데이트됨** 이러한 시간 초과 매개변수의 값으로 "무한대"가 지정되면 시간 초과 논리는 다음과 같습니다.장애가 있는.
JobTimeoutSec=, JobRunningTimeoutSec=,TimeoutStartSec=, TimeoutAbortSec=
JobRunningTimeoutSec=이 DefaultTimeoutStartSec=인 장치 장치를 제외하고 기본값은 "무한대"(작업 시간 초과가 비활성화됨)입니다.
인용하다:여기에 링크 설명을 입력하세요
다시 말하지만, 이 논리는 서비스 수준에 적용되며 아래 URL에 명확하게 나열되어 있습니다. 인용하다:여기에 링크 설명을 입력하세요
답변2
실행할 때 systemctl show SERVICE_NAME.service -p TimeoutStopUSec
적어도 내 서비스에 대해 systemd가 설정한 시간 초과를 볼 수 있습니다.
제대로 작동하도록 스크립트를 일반 단위 파일 중 하나로 변경했습니다.
답변3
패키지의 서비스 파일을 편집하지 말고( /usr/lib/systemd/system/
패키지가 업그레이드되면 이 파일을 덮어씁니다) 대신 다음을 사용하십시오.
sudo EDITOR=/bin/vi systemctl edit <service-name>
(예, nano가 기본 편집기입니다! 이런!)
그러면 파일이 안전하게 편집됩니다 /etc/systemd/system/service-name.service.d/override.conf
.
파일에는 다음만 포함되어야 합니다.
[Service]
# Override default 90 second timeout in pathological conditions
TimeoutStopSec=5 # or whatever value you want
전반적인 효과를 보려면 다음 명령을 입력하십시오.
systemctl cat <service-name>
답변4
원하는 것을 달성하기 위해 다음 3가지 명령을 사용했습니다.
기본 시간 초과 값을 확인하려면
systemctl show yourServiceName.service | grep ^Timeout
기본 시간 초과 값을 늘리려면
mkdir /etc/systemd/system/yourServiceName.service.d
echo -e "[Service]\nTimeoutStartSec=180" | tee /etc/systemd/system/yourServiceName.service.d/startup-timeout.conf
어디,
yourServiceName
: 서비스 이름입니다. 예를 들어 Fluid, Weblogic 등이 있습니다.TimeoutStartSec=180
: 여기서는 제한 시간 값으로 180초/3분을 사용하고 있습니다.