Systemd: รีสตาร์ทอินสแตนซ์ทั้งหมดของบริการอินสแตนซ์ทั้งหมดในครั้งเดียว


17

ฉันใช้ฟีเจอร์ที่ดีของ systemd: บริการอินสแตนซ์

มีวิธีง่าย ๆ ในการโหลดบริการอินสแตนซ์ทั้งหมดด้วยการโทรเพียงครั้งเดียวหรือไม่?

ตัวอย่าง: ฉันไม่ต้องการเรียกใช้ทั้งหมดเช่นนี้:

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

ฉันลองสิ่งนี้ แต่มันใช้ไม่ได้

systemctl restart autossh@*

เกี่ยวข้อง: เริ่มต้นกระบวนการ N ด้วยหนึ่งไฟล์ systemd service

ปรับปรุง

ก่อนอื่นฉันรู้สึกประทับใจกับบริการที่ทำให้เข้าใจได้ แต่หลังจากนั้นฉันก็รู้ว่าการใช้เครื่องมือจัดการการกำหนดค่าเช่น Ansible เหมาะสมกว่า ฉันเรียนรู้: ทำให้เครื่องมือง่ายขึ้น เครื่องมือมากมายเริ่มใช้การตรวจสอบเงื่อนไข (ถ้า .. .. อื่น ๆ ) และวนซ้ำ ตัวอย่างเช่น webservers หรือ mailserver congfiguration แต่สิ่งนี้ควรได้รับการแก้ไขในระดับที่แตกต่าง (บน): การจัดการการกำหนดค่า ดู: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

คำตอบ:


23

Systemd (เริ่มต้นจาก systemd-209) รองรับไวด์การ์ดอย่างไรก็ตามเชลล์ของคุณมีแนวโน้มที่จะพยายามขยายมัน ใช้เครื่องหมายคำพูดเพื่อส่งสัญลักษณ์แทนไปที่คำสั่ง systemctl / service verbatim:

systemctl restart 'autossh@*'

ใช้งานไม่ได้สำหรับฉัน: systemctl status 'autossh@*'เอาท์พุท: autossh@\x2a.service - ... Active: inactive (dead)เวอร์ชัน:systemd 195
guettli

2
Globbing มีให้บริการตั้งแต่ systemd 209: lists.freedesktop.org/archives/systemd-devel/2014- กุมภาพันธ์ / ......
weirdan

หากคุณมีบริการมากมายที่จะเริ่มต้นใหม่คำสั่ง while loop ใน guettli จะทำงานได้ดีขึ้นเนื่องจาก wildcard ดูเหมือนจะพยายามเริ่มต้นใหม่ทั้งหมดในครั้งเดียว ผ่านการทดสอบด้วยบริการ ~ 1,000 php-fpm โหลดได้ถึง 400 และฉันต้องรีบูตเซิร์ฟเวอร์
boutch55555

1
ใช้งานได้หากกระบวนการกำลังทำงานอยู่ แต่จะไม่สามารถเริ่มได้ในครั้งแรกหลังจากเปิดใช้งาน แต่คุณสามารถใช้systemctl restart autossh@{1..2}(กับ N แทนใด ๆ2) ซึ่งเป็นทั่วไปเล็กน้อยน้อย inactive (dead)แต่ก็ยังจะเริ่มต้นกระบวนการที่ว่าพวกเขาจะ
giorgiosironi

7

ไม่ดี แต่ใช้งานได้กับระบบที่มี systemd เก่า:

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

แน่นอนทางออกจากคำตอบข้างต้น ( systemctl restart 'autossh@*') ดีกว่า


ระวัง: cutอาจแจงฟิลด์ที่ไม่ถูกต้องในกรณีที่มีการบริการที่ล้มเหลวในการส่งออกหน่วยรายการ
Juuso Ohtonen

5

@weirdan คำตอบนั้นถูกต้อง แต่ไม่มีอะไรในการแจกแจงบางอย่าง

สำหรับCentos 7 และที่คล้ายกันคุณสามารถทำได้:

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

แต่ (เริ่มต้น) จะใช้งานได้เฉพาะถ้าคุณระบุแฟล็ก "--all":

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

มิฉะนั้นจะไม่พบบริการเนื่องจากไม่มีอยู่ นี่คือคุณสมบัติที่ตั้งใจของ systemd

สำหรับระบบที่ทำงานบนUbuntuมันใช้วิธีเดียวกัน แต่ความแตกต่างคือต้องระบุแฟล็ก "--all" สำหรับอาร์กิวเมนต์ของระบบทั้งหมดไม่เช่นนั้นจะไม่ทำอะไรเลย

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

2

ฉันไม่รู้ว่ามีตัวเลือกสำหรับตัวแทนใน terminal สำหรับ systemd หรือไม่ สิ่งที่คุณสามารถทำได้คือการเพิ่มสคริปต์ systemd ของคุณ

% i จะทำเคล็ดลับที่ฉันคิด แต่เกี่ยวข้องกับวิธีที่คุณใช้สคริปต์การบริการอินสแตนซ์

คุณอาจพบคำอธิบายที่นี่เรียกว่าตัวระบุ

ซึ่งแสดงให้เห็นว่า:

n%

ชื่อหน่วยเต็ม

p%

สำหรับหน่วยที่สร้างอินสแตนซ์นี่หมายถึงสตริงก่อนอักขระ "@" ของชื่อหน่วย สำหรับหน่วยที่ไม่ได้สร้างอินสแตนซ์นี่หมายถึงชื่อของหน่วยที่ลบส่วนต่อท้ายประเภท

%ผม

สำหรับหน่วยอินสแตนซ์: นี่คือสตริงระหว่างอักขระ "@" และส่วนต่อท้ายของชื่อหน่วยชื่อหน่วย

ฉันไม่ได้ตอบคำถามของคุณโดยตรง แต่สำหรับสิ่งที่ฉันคิดว่าคุณพยายามที่จะบรรลุ หากคุณคิดว่าวิธีการแก้ปัญหาของคุณอาจพบได้ตามแนวคิดนี้โปรดแชร์สคริปต์ systemd ของคุณเพื่อให้เราสามารถอธิบายตัวอย่างและในที่สุดก็อาจมอบสคริปต์ขั้นสุดท้ายให้กับคุณ

หากคุณรู้สึกมั่นใจในการแก้ไขสคริปต์ของคุณเองเพื่อเข้าถึงวิธีการแก้ปัญหาที่นี่คุณมีตัวอย่าง (ฉันจะไม่พูดมันเพราะฉันไม่รู้ว่ามันเกี่ยวข้องกับการแก้ปัญหาหรือไม่และเฉพาะเจาะจงเกินไปกับสิ่งที่ฉัน ' m เสนอ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.