Menambahkan penundaan antara berhenti dan mulai dari suatu proses di systemd

10

Saya memiliki masalah yang sangat aneh systemd. Ketika saya mengeluarkannya, systemctl restartitu akan memulai proses baru sebelum yang sebelumnya selesai.

Ini dapat dilihat di log, di mana pesan penutupan terakhir ("log penutupan") dicatat setelah pesan pembuka ("log pembuka").

Apakah ada cara untuk menambahkan penundaan antara penghentian dan dimulainya proses?

Šimon Tóth
sumber
Tidak ada yang menghentikan Anda dari berlarisystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti
Kenapa itu aneh? Ini adalah fitur desain yang membuat Anda sendirian untuk mengatasi masalah dunia nyata. Suntikkan sleep di Unit Anda mulai atau gunakan kondisi ExecPre untuk memastikan instance lama sepenuhnya hilang.
Florian Heigl

Jawaban:

13

Dalam file layanan systemd Anda, Anda dapat mengatur opsi RestartSec untuk menambahkan penundaan untuk restart. Lihat contoh di bawah ini:

[Service]
Restart=always
RestartSec=30

Periksa tautan ini untuk lebih banyak contoh.

mmohammad
sumber
1
afaik RestartSechanya berlaku untuk layanan yang dikonfigurasikan dengan Restart=arahan dan tidak diperhitungkan saat melakukan asystemctl restart someservice
don_crissti
1

RestartSec tampaknya hanya digunakan jika layanan tertentu itu yang direstart melalui perintah restart systemctl.

Misalnya, saya punya dua layanan, A dan B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

dan

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Jika Anda melakukan systemctl restart B, itu berfungsi seperti yang diharapkan ... tetapi jika Anda melakukan systemctl restart A, kedua layanan dihentikan dan segera mulai lagi, tanpa penundaan.

Systemd tampaknya hanya menggunakan nilai konfigurasi untuk satu layanan yang Anda tentukan, dan mengabaikannya untuk setiap dependensi.

Ini tidak biasa seperti kedengarannya. Jika B berbicara ke server jarak jauh, memulai dan menghentikan dengan cepat dapat gagal karena ujung jarak jauh menolak klien. Tetapi memulai ulang A secara langsung akan terjadi setiap kali A diperbarui tanpa perubahan ke B.

Anda mungkin dapat mengatasi ini dengan menambahkan penundaan ke A juga, tetapi Anda tidak perlu PERLU untuk melakukan ini, karena itu merusak isolasi objek dengan membuat A tahu tentang B ketika itu bukan ketergantungan.

Takut Quixadhal
sumber