Systemd servis zaman aşımı değeri nasıl değiştirilir?


33

Şu an çalışmakta olduğum şirkette eski bir servis var ve init betiği eski SysvInit kullanıyor, fakat sistemdeyken çalışıyor (CentOS 7).

Çok fazla hesaplama olduğundan, bu hizmetin tamamlanması yaklaşık 70 saniye sürer. Systemd için herhangi bir zaman aşımı süresi ayarlamamıştım ve varsayılan yapılandırmaları değiştirmedim /etc/systemd/system.conf, ancak yine service SERVICE stopde hizmetimi yürütürken 60 saniye sonra zaman aşımına uğradı .

İle kontrol journalctl -b -u SERVICE.serviceBu günlüğü buluyorum:

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]

Zaten değiştirmeyi denedim DefaultTimeoutStopSecmülk /etc/systemd/system.confiçin 90s, ancak zaman aşımı hala olmuyor.

60'larda neden zaman aşımına uğradığı hakkında fikri olan var mı? Bu zaman aşımı değerinin yapılandırıldığı başka bir yer var mı? Kontrol edebileceğim bir yol var mı?

Bu hizmet kullandığı, java 7 ile ve onu Artalanda çalışır JSVC . -waitParametreyi değere göre yapılandırdım 120.

Yanıtlar:


54

Sistemim hizmetim, başlatılmasının ne kadar zaman alacağı nedeniyle zaman aşımına uğradı, bu da benim için düzeltti:

  1. Systemd dosyanızı düzenleyin:
    • Modern versiyonlar içinsystemd : Koş systemctl edit --full node.service( "düğümü" servis adınla değiştir )
      • Bu, sistemdeki dosyayı /etc/systemd/system/node.service.d/geçersiz kılacak bir sistem dosyası oluşturacaktır /usr/lib/systemd/system/node.service. Sistem dosyalarınızı yapılandırmanın doğru yolu budur. Nasıl kullanımına dair daha fazla bilgi systemctl editolduğunu burada .
    • Doğrudan sistem dosyasını düzenleme : Benim için sistem dosyası /usr/lib/systemd/system/node.service. "Düğüm" ü uygulama adınızla değiştirin. Ancak, içindeki dosyaları doğrudan düzenlemek güvenli değildir /usr/lib/systemd/(Yorumlara bakın)
  2. Kullanım TimeoutStartSec, TimeoutStopSecya TimeoutSec(daha fazla bilgi burada ) zaman aşımı başlayan ve sürecini durdurmak için ne kadar sürmesi gerektiğini belirtmek için. Daha sonra, sistem dosyam böyle görünüyordu:

    [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
    
    • Bunlardan herhangi birini çalıştırarak mevcut Zaman Aşımı durumunu da görebilirsiniz (ancak değişiklik yapmak için servisinizi düzenlemeniz gerekir! 1. adıma bakın):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Sonra sistemi yeniden yüklemeniz gerekecek systemctl reload node.service
  4. Şimdi hizmetinize başlamaya çalışın systemctl start node.service
  5. Bu işe yaramazsa , systemctl'yi yeniden başlatmayı deneyin.systemctl reboot
  6. Bu işi değildir yaptıysak , kullanmayı deneyin --no-blockşöyle systemctl seçeneğini: systemctl --no-block start node.service. Bu seçenek burada açıklanmıştır : "İstenilen işlemin bitmesini beklemeyin. Bu belirtilmezse, iş doğrulanır, kullanılır ve birimin başlatılması tamamlanıncaya kadar systemctl bekler. Bu argümanı ileterek yalnızca doğrulandı ve onaylandı. "
    • systemctl maskBunun yerine kullanmak için bir seçenek de var systemctl start. Daha fazla bilgi için buraya bakınız .

Yorumlardan Güncellemeler:

  • TimeoutSec=infinity: Burada "sonsuzluk" kullanmak yerine, TimeoutSec=900(15 dakika) gibi çok fazla zaman koyun . Uygulama çıkmak için "sonsuza kadar" sürerse, o zaman süresiz olarak yeniden başlatmayı engellemesi mümkündür. Credit @Alexis Wilke ve @JCCyC
  • Düzenlemek yerine /usr/lib/systemd/system, systemctl edityerine deneyin veya /etc/systemd/systemgeçersiz kılmak için düzenleyin . Hizmet dosyalarını hiçbir zaman içinde düzenlememelisiniz /usr/lib/. Credit @ reaeager ve @ 0xC0000022L

8
TimeoutSec=infinity- bu bloğun süresiz olarak yeniden başlatılması mümkün olmaz mıydı? Ya bu sürecin çıkması "sonsuza kadar" sürerse? Gibi 5min, ama büyük olasılıkla değil infinity... öneririm ...
Alexis Wilke

6
/ usr / lib içindeki servis dosyalarını düzenlememelisiniz, düzenlemelisiniz veya / etc / systemd / system
ryeager

5
Tavsiyenin özü sağlam olsa da, bunun için @ryeager ... systemdteklifin modern versiyonlarıyla systemctl edit(ve maskonları kaba kuvveti ile etkisiz hale getirmek) hemfikir olmalıyım disable. İçindeki dosyaları asla düzenlememelisin /usr/lib/systemd.
0xC0000022L

3
TimeoutSec=infinityBurada işe yaramadı, kullandım TimeOutSec=900(15 dakika) ve bu benim posterior kurtardı. - systemctl daemon-reloadHizmeti tekrar başlatmadan önce çalıştırmam gerekiyordu .
JCCyC

10

Çalıştırmak systemctl show SERVICE_NAME.service -p TimeoutStopUSecen azından systemd tarafından ayarlanan zaman aşımı hizmetimi görebiliyordu.

Düzgün çalışması için betiği normal bir birim dosyasına değiştirdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.