Làm thế nào để thay đổi giá trị thời gian chờ dịch vụ systemd?


33

Trong công ty tôi đang làm việc hiện có một dịch vụ kế thừa và tập lệnh init của nó đang sử dụng SysvInit cũ, nhưng đang chạy trên systemd (CentOS 7).

Bởi vì có rất nhiều tính toán, dịch vụ này mất khoảng 70 giây để hoàn thành. Tôi đã không định cấu hình bất kỳ thời gian chờ nào cho systemd và không thay đổi cấu hình mặc định tại /etc/systemd/system.conf, nhưng khi tôi thực hiện service SERVICE stopdịch vụ của mình thì hết thời gian sau 60 giây.

Kiểm tra với journalctl -b -u SERVICE.servicetôi tìm thấy nhật ký này:

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]

Tôi đã cố gắng thay đổi DefaultTimeoutStopSecbất động sản tại /etc/systemd/system.confđến 90s, nhưng thời gian chờ vẫn xảy ra.

Có ai có ý tưởng tại sao nó hết thời gian ở tuổi 60 không? Có nơi nào khác mà giá trị thời gian chờ này được cấu hình không? Có cách nào tôi có thể kiểm tra nó?

Dịch vụ này chạy với java 7 và để daemonize nó, nó sử dụng JSVC . Tôi cấu hình -waittham số với giá trị 120.

Câu trả lời:


54

Dịch vụ systemd của tôi liên tục hết thời gian vì cũng mất bao lâu để khởi động, vì vậy điều này đã khắc phục nó cho tôi:

  1. Chỉnh sửa tập tin systemd của bạn:
    • Đối với các phiên bản hiện đại củasystemd : Chạy systemctl edit --full node.service( thay thế "nút" bằng tên dịch vụ của bạn ).
      • Điều này sẽ tạo một tệp hệ thống tại /etc/systemd/system/node.service.d/đó sẽ ghi đè lên tệp hệ thống tại /usr/lib/systemd/system/node.service. Đây là cách thích hợp để cấu hình các tập tin hệ thống của bạn. Thông tin thêm về cách sử dụng systemctl editở đây .
    • Chỉnh sửa trực tiếp tệp hệ thống : Tệp hệ thống cho tôi là tại /usr/lib/systemd/system/node.service. Thay thế "nút" bằng tên ứng dụng của bạn. Tuy nhiên, không an toàn khi chỉnh sửa trực tiếp các tệp trong /usr/lib/systemd/(Xem bình luận)
  2. Sử dụng TimeoutStartSec, TimeoutStopSechoặc TimeoutSec(thông tin thêm ở đây ) để chỉ định thời gian chờ nên bắt đầu và dừng quá trình. Sau đó, đây là cách tập tin systemd của tôi trông:

    [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
    
    • Bạn cũng có thể xem trạng thái Hết giờ hiện tại bằng cách chạy bất kỳ trong số này (nhưng bạn sẽ cần chỉnh sửa dịch vụ của mình để thay đổi! Xem bước 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Tiếp theo bạn sẽ cần tải lại systemd với systemctl reload node.service
  4. Bây giờ hãy thử bắt đầu dịch vụ của bạn với systemctl start node.service
  5. Nếu điều đó không làm việc , hãy thử khởi động lại systemctl vớisystemctl reboot
  6. Nếu điều đó không hiệu quả , hãy thử sử dụng --no-blocktùy chọn cho systemctl như vậy : systemctl --no-block start node.service. Tùy chọn này được mô tả ở đây : "Không chờ đồng bộ để thao tác được yêu cầu kết thúc. Nếu điều này không được chỉ định, công việc sẽ được xác minh, xử lý và systemctl sẽ đợi cho đến khi hoàn thành khởi động đơn vị. chỉ được xác minh và mê hoặc. "
    • Ngoài ra còn có tùy chọn để sử dụng systemctl maskthay vì systemctl start. Để biết thêm thông tin xem tại đây .

Cập nhật từ Nhận xét:

  • TimeoutSec=infinity: Thay vì sử dụng "vô cực" ở đây, hãy đặt một lượng lớn thời gian thay vào đó, như TimeoutSec=900(15 phút). Nếu ứng dụng mất "mãi mãi" để thoát, thì có thể ứng dụng sẽ chặn khởi động lại vô thời hạn. Tín dụng @Alexis Wilke và @JCCyC
  • Thay vì chỉnh sửa /usr/lib/systemd/system, systemctl editthay vào đó hãy thử hoặc chỉnh sửa /etc/systemd/systemđể ghi đè chúng. Bạn không bao giờ nên chỉnh sửa các tập tin dịch vụ trong /usr/lib/. Tín dụng @ryeager và @ 0xC0000022L

8
TimeoutSec=infinity- không thể khối này khởi động lại vô thời hạn? Điều gì xảy ra nếu quá trình "thoát" mãi mãi? Tôi muốn đề xuất một số tiền lớn, như 5min, nhưng có lẽ là không infinity...
Alexis Wilke

6
bạn không nên chỉnh sửa các tệp dịch vụ trong / usr / lib, bạn nên chỉnh sửa chúng hoặc ghi đè chúng trong / etc / systemd / system
ryeager

5
Trong khi ý chính của lời khuyên là âm thanh, tôi phải đồng ý với @ryeager ... các phiên bản hiện đại của systemdđề nghị systemctl edit(và maskvô hiệu hóa chúng bằng vũ lực, trái ngược với disable) cho mục đích đó. Bạn không bao giờ nên chỉnh sửa các tập tin trong /usr/lib/systemd.
0xC0000022L

3
TimeoutSec=infinitykhông làm việc ở đây, tôi đã sử dụng TimeOutSec=900(15 phút) và điều đó đã cứu tôi. - Tôi cần chạy systemctl daemon-reloadsau đó, trước khi khởi động lại dịch vụ.
JCCyC

10

Đang chạy systemctl show SERVICE_NAME.service -p TimeoutStopUSec tôi ít nhất có thể thấy thời gian chờ được đặt bởi systemd cho dịch vụ của mình.

Tôi đã thay đổi tập lệnh thành tập tin đơn vị thông thường để tập tin hoạt động bình thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.