시스템 서비스 시간 초과 값을 변경하는 방법은 무엇입니까? 서비스가 있으며 그 초기 스크립트는 오래된 SysvInit를

내가 지금 일하고있는 회사에는 레거시 서비스가 있으며 그 초기 스크립트는 오래된 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.



답변

내 시스템 서비스는 부팅하는 데 시간이 오래 걸리기 때문에 시간이 초과되어 계속 수정되었습니다.

  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 단계 참조).
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. 다음으로 시스템을 다시로드해야합니다. 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=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가 내 서비스에 설정 한 시간 초과를 볼 수있었습니다.

제대로 작동하기 위해 스크립트를 일반 단위 파일로 변경했습니다.