시스템 서비스 시간 초과 값을 변경하는 방법은 무엇입니까?

시스템 서비스 시간 초과 값을 변경하는 방법은 무엇입니까?

현재 제가 일하는 회사에는 초기화 스크립트가 이전 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 서비스는 시작하는 데 시간이 오래 걸리기 때문에 항상 시간 초과되므로 문제가 해결되었습니다.

  1. 시스템 파일을 편집합니다:

    • 현대 버전의 경우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/(설명 참조).
  2. 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
  3. 다음으로 systemd를 다시 로드해야 합니다.systemctl reload node.service

  4. 이제 서비스를 시작해 보세요systemctl start node.service

  5. 그게 작동하지 않으면, systemctl을 다시 시작해 보세요.systemctl reboot

  6. 그게 작동하지 않으면--no-block, 다음과 같이 systemctl 옵션을 사용해 보십시오 .systemctl --no-block start node.service. 이 옵션에는 설명이 있습니다.여기: "요청된 작업이 완료될 때까지 동기적으로 기다리지 마십시오. 지정하지 않으면 작업이 검증되고 큐에 추가되며 systemctl은 장치 시작이 완료될 때까지 기다립니다. 이 매개변수를 전달하면 검증 및 큐에 넣기만 수행됩니다. ."

    • systemctl mask대신 사용할 수 있는 옵션도 있습니다 systemctl start. 자세한 내용은 을 참조하세요.여기.

댓글 업데이트:

  • TimeoutSec=infinity: 여기서는 "무한대"를 사용하는 대신 긴 시간(예: TimeoutSec=90015분)을 사용합니다. 응용 프로그램을 종료하는 데 "영구" 시간이 걸리는 경우 다시 시작이 무기한 차단될 수 있습니다. 이미지 출처: @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분을 사용하고 있습니다.

관련 정보