Systemd: Mulai ulang semua instance Layanan Instantiated sekaligus

17

Saya menggunakan fitur bagus dari systemd: Layanan Instantiated.

Apakah ada cara sederhana untuk memuat ulang semua layanan instantiated dengan satu panggilan?

Contoh: Saya tidak ingin menjalankan semua seperti ini:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

Saya mencoba ini, tetapi ini tidak berhasil

systemctl restart autossh@*

Terkait: Mulai proses N dengan satu file layanan systemd

Memperbarui

Pertama saya terpesona oleh Instantiated Services, tetapi kemudian saya menyadari bahwa menjalankan alat manajemen konfigurasi seperti Ansible lebih masuk akal. Saya belajar: Menjaga alat tetap sederhana. Banyak alat mulai menerapkan pemeriksaan kondisi (jika .. lain ...) dan loop. Misalnya konfigurasi webserver atau mailserver. Tetapi ini harus dipecahkan pada level (atas) yang berbeda: manajemen konfigurasi. Lihat: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

guettli
sumber

Jawaban:

23

Systemd (mulai dari systemd-209) mendukung wildcard, namun shell Anda kemungkinan mencoba untuk mengembangkannya. Gunakan kutipan untuk meneruskan wildcard ke perintah systemctl / service kata demi kata:

systemctl restart 'autossh@*'
orang aneh
sumber
Tidak bekerja untuk saya: systemctl status 'autossh@*'output: autossh@\x2a.service - ... Active: inactive (dead)Versi:systemd 195
guettli
2
Globbing tersedia mulai dari systemd 209: lists.freedesktop.org/archives/systemd-devel/2014-February/…
oddan
Jika Anda memiliki banyak layanan untuk memulai kembali, loop sementara di jawaban guettli akan bekerja lebih baik, karena wildcard tampaknya mencoba untuk memulai kembali semuanya sekaligus. Diuji dengan ~ 1000 layanan php-fpm, memuat naik hingga 400 dan saya harus me-reboot server.
boutch55555
1
Berfungsi jika proses sudah berjalan, tetapi tidak jika harus dimulai untuk pertama kalinya setelah diaktifkan. Tetapi Anda dapat menggunakan systemctl restart autossh@{1..2}(dengan N sebagai ganti bukan 2) yang sedikit kurang umum tetapi juga akan memulai proses jika mereka inactive (dead).
giorgiosironi
7

Tidak bagus, tetapi ini berfungsi untuk sistem dengan sistem lama:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

Tentu saja solusi dari jawaban di atas ( systemctl restart 'autossh@*') lebih baik.

guettli
sumber
Hati-hati: cutdapat menguraikan bidang yang salah jika ada layanan gagal dalam daftar unit output.
Juuso Ohtonen
5

@weirdan Jawabannya benar, tetapi tidak ada sesuatu untuk distribusi tertentu.

Untuk Centos 7 dan yang serupa , Anda dapat melakukan:

systemctl (start|stop|restart|status) my-service@*

TETAPI, (mulai) akan HANYA berfungsi, jika Anda menentukan tanda "--all":

systemctl (start) my-service@* --all

Kalau tidak, itu tidak akan menemukan layanan, karena mereka tidak ada. Ini adalah fitur yang dimaksudkan systemd.

Untuk sistem berbasis Ubuntu , ia bekerja dengan cara yang hampir sama, tetapi perbedaannya adalah bahwa flag "--all" harus ditentukan untuk semua argumen systemctl, jika tidak, ia tidak akan melakukan apa-apa.

systemctl (start|stop|restart|status) 'my-service@*' --all
ku4eto
sumber
2

Saya tidak tahu apakah ada opsi untuk wildcard di terminal untuk systemd. Yang dapat Anda lakukan adalah menambahkan satu di skrip systemd Anda.

% Saya akan melakukan trik yang saya pikir tetapi terkait dengan cara Anda membuat skrip layanan instantiated.

Anda dapat menemukan penjelasan di sini yang disebut sebagai penentu

yang menunjukkan bahwa:

% n

nama unit lengkap

% p

Untuk unit instantiated, ini merujuk ke string sebelum karakter "@" dari nama unit. Untuk unit non-instantiated, ini merujuk pada nama unit dengan tipe suffix yang dihapus.

%saya

Untuk unit instantiated: ini adalah string antara karakter "@" dan akhiran nama unit. Nama unit

Saya tidak langsung menjawab pertanyaan Anda, tetapi untuk apa yang saya kira Anda coba capai. Jika menurut Anda solusi Anda dapat ditemukan mengikuti ide ini, silakan bagikan skrip systemd Anda, sehingga kami akhirnya dapat mengilustrasikan dengan contoh dan bahkan mungkin memberikan Anda skrip akhir.

Jika Anda merasa percaya diri dalam mengedit skrip Anda sendiri untuk mencapai solusi seperti itu, di sini Anda memiliki contoh (saya tidak akan mengutipnya karena saya tidak tahu apakah itu relevan untuk solusi, dan terlalu spesifik untuk apa yang saya ' m melamar)

ignivs
sumber