Bagaimana cara mengubah nilai batas waktu layanan systemd?


33

Di perusahaan saya bekerja sekarang ada layanan warisan dan skrip init-nya menggunakan SysvInit lama, tetapi berjalan di systemd (CentOS 7).

Karena ada banyak perhitungan, layanan ini membutuhkan waktu sekitar 70 detik untuk menyelesaikannya. Saya tidak mengkonfigurasi batas waktu untuk systemd, dan tidak mengubah konfigurasi default di /etc/systemd/system.conf, tetapi masih ketika saya menjalankan service SERVICE stoplayanan saya waktu setelah 60 detik.

Memeriksa dengan journalctl -b -u SERVICE.servicesaya menemukan log ini:

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]

Saya sudah mencoba mengubah DefaultTimeoutStopSecproperti /etc/systemd/system.confmenjadi 90s, tetapi batas waktu masih terjadi.

Adakah yang tahu mengapa waktu habis di 60-an? Apakah ada tempat lain yang nilai batas waktu ini dikonfigurasi? Apakah ada cara saya bisa memeriksanya?

Layanan ini berjalan dengan java 7 dan untuk daemonize, ia menggunakan JSVC . Saya mengkonfigurasi -waitparameter dengan nilai 120.

Jawaban:


55

Layanan systemd saya membuat waktu tidak aktif karena berapa lama waktu yang dibutuhkan untuk boot juga, jadi ini memperbaikinya bagi saya:

  1. Edit file systemd Anda:
    • Untuk versi modernsystemd : Jalankan systemctl edit --full node.service( ganti "node" dengan nama layanan Anda ).
      • Ini akan membuat file sistem pada saat /etc/systemd/system/node.service.d/itu akan menimpa file sistem di /usr/lib/systemd/system/node.service. Ini adalah cara yang tepat untuk mengkonfigurasi file sistem Anda. Informasi lebih lanjut tentang cara menggunakan systemctl editada di sini .
    • Mengedit file sistem secara langsung : File sistem untuk saya ada di /usr/lib/systemd/system/node.service. Ganti "simpul" dengan nama aplikasi Anda. Namun, tidak aman untuk langsung mengedit file di /usr/lib/systemd/(Lihat komentar)
  2. Gunakan TimeoutStartSec, TimeoutStopSecatau TimeoutSec(info lebih lanjut di sini ) untuk menentukan berapa lama waktu habis untuk memulai & menghentikan proses. Setelah itu, ini adalah bagaimana file systemd saya terlihat:

    [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
    
    • Anda juga dapat melihat status Timeout saat ini dengan menjalankan semua ini (tetapi Anda harus mengedit layanan Anda untuk melakukan perubahan! Lihat langkah 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Selanjutnya Anda harus memuat ulang systemd dengan systemctl reload node.service
  4. Sekarang cobalah untuk memulai layanan Anda dengan systemctl start node.service
  5. Jika itu tidak berhasil , cobalah untuk me-reboot systemctl dengansystemctl reboot
  6. Jika itu tidak bekerja , coba gunakan --no-blockpilihan untuk systemctl seperti: systemctl --no-block start node.service. Opsi ini dijelaskan di sini : "Jangan serempak menunggu operasi yang diminta selesai. Jika ini tidak ditentukan, pekerjaan akan diverifikasi, enqueued dan systemctl akan menunggu sampai unit start-up selesai. Dengan melewati argumen ini, itu hanya diverifikasi dan enqueued. "
    • Ada juga pilihan untuk menggunakan systemctl maskbukan systemctl start. Untuk info lebih lanjut lihat di sini .

Pembaruan dari Komentar:

  • TimeoutSec=infinity: Alih-alih menggunakan "tak terbatas" di sini, taruh sejumlah besar waktu sebagai gantinya, seperti TimeoutSec=900(15 menit). Jika aplikasi membutuhkan "selamanya" untuk keluar, maka ada kemungkinan ia akan memblokir reboot tanpa batas waktu. Credit @Alexis Wilke dan @JCCyC
  • Alih-alih mengedit /usr/lib/systemd/system, coba systemctl editsebagai gantinya atau edit /etc/systemd/systemuntuk menimpanya. Anda tidak boleh mengedit file layanan di /usr/lib/. Credit @ryeager dan @ 0xC0000022L

8
TimeoutSec=infinity- tidakkah mungkin blok ini akan reboot tanpa batas waktu? Bagaimana jika dibutuhkan "selamanya" untuk proses itu keluar? Saya sarankan sejumlah besar, seperti 5min, tapi mungkin tidak infinity...
Alexis Wilke

6
Anda tidak boleh mengedit file layanan di / usr / lib, Anda harus mengeditnya atau
menimpanya

5
Sementara inti dari sarannya adalah suara, saya harus setuju dengan @ryeager ... versi modern dari systemdpenawaran systemctl edit(dan maskuntuk menonaktifkannya dengan kekuatan kasar, sebagai lawan dari disable) untuk tujuan itu. Anda tidak boleh mengedit file di /usr/lib/systemd.
0xC0000022L

3
TimeoutSec=infinitytidak bekerja di sini, saya menggunakan TimeOutSec=900(15 menit) dan itu menyelamatkan posterior saya. - Saya perlu menjalankan systemctl daemon-reloadsetelah itu, sebelum memulai kembali layanan.
JCCyC

10

Menjalankan systemctl show SERVICE_NAME.service -p TimeoutStopUSecSaya setidaknya bisa melihat batas waktu yang ditetapkan oleh systemd ke layanan saya.

Saya mengubah script menjadi satu file unit biasa agar berfungsi dengan baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.