วิธีสร้างและเรียกใช้หน่วยบริการใหม่ใน Systemd
เมื่อไม่กี่วันก่อน ฉันเจอ Centos 8 32 บิต และรู้สึกอยากทดสอบกับเครื่อง 32 บิตรุ่นเก่า หลังจากบูต ฉันก็พบว่ามีข้อบกพร่อง และการเชื่อมต่อเครือข่ายขาดหาย ซึ่งฉันต้องเปิด “ขึ้น ” ด้วยตนเองทุกครั้งหลังบูต ดังนั้น คำถามคือ ฉันจะตั้งค่าสคริปต์ให้ทำงานนี้ทุกครั้งที่บูตเครื่องได้อย่างไร
มันง่ายมาก และฉันจะแสดงให้คุณเห็นถึงวิธีการใช้หน่วยบริการของระบบ แต่ก่อนอื่นขอแนะนำหน่วยบริการเล็กน้อย
ในบทความนี้ ฉันจะอธิบายว่า “หน่วยบริการ ” ใน systemd คืออะไร และการสร้างและเรียกใช้หน่วยบริการนั้นง่ายเพียงใด ฉันจะพยายามทำให้ “เป้าหมาย ” คืออะไร ทำไมเราถึงเรียกมันว่า “คอลเลกชันของหน่วย ” และ “ความต้องการ ” ของพวกเขาคืออะไร สุดท้ายนี้ เรากำลังใช้ประโยชน์จากหน่วยบริการเพื่อเรียกใช้สคริปต์ของเราเองหลังจากขั้นตอนการบู๊ต
เห็นได้ชัดว่าคอมพิวเตอร์ของคุณมีประโยชน์เนื่องจากบริการต่างๆ ที่นำเสนอ และเพื่อให้มีฟังก์ชันนี้ บริการหลายอย่างจะต้องถูกเรียกว่าเป็นคอมพิวเตอร์บูทและไปถึงระดับต่างๆ
บริการอื่นๆ จะถูกเรียกให้ดำเนินการเมื่อคอมพิวเตอร์ไปถึง เช่น ระดับการช่วยเหลือ (ระดับรัน 0) และบริการอื่นๆ เมื่อถึงระดับผู้ใช้หลายคน (ระดับรัน 3) . คุณสามารถจินตนาการถึงระดับเหล่านี้เป็นเป้าหมาย
พูดง่ายๆ ก็คือ เป้าหมาย คือกลุ่มของหน่วยบริการ หากคุณต้องการดูหน่วยบริการที่ทำงานในระดับ graphical.target ให้พิมพ์:
systemctl --type=service
ดังที่คุณเห็นว่าบริการบางอย่างทำงานอยู่และ “ทำงานอยู่” ตลอดเวลา ในขณะที่บริการอื่น ๆ ทำงานครั้งเดียวและยุติ (ออก)
หากต้องการตรวจสอบสถานะของบริการคุณสามารถใช้คำสั่ง systemctl ดังภาพ
systemctl status firewalld.service
อย่างที่คุณเห็นฉันได้ตรวจสอบสถานะของ firewalld.service
(เคล็ดลับ: คุณสามารถใช้การเติมอัตโนมัติสำหรับชื่อของบริการได้ ). แจ้งฉันว่าบริการ firewalld ทำงานตลอดเวลาและเปิดใช้งานอยู่
เปิดใช้งานและปิดใช้งานหมายความว่าบริการจะถูกโหลดอย่างถาวรหรือไม่ในระหว่างการบู๊ตครั้งถัดไปตามลำดับ ในทางกลับกัน การเริ่มและหยุดบริการมีข้อจำกัดของเซสชันปัจจุบันและไม่ถาวร
ตัวอย่างเช่น ถ้าคุณพิมพ์:
systemctl stop firewalld.service
systemctl status firewalld.service
คุณจะเห็นว่า firewalld.service
ไม่ได้ใช้งาน (ตาย) แต่ยังคงเปิดใช้งานอยู่ ซึ่งหมายความว่าในระหว่างการบูตครั้งต่อไป ไฟดังกล่าวจะถูกโหลด ดังนั้นหากเราต้องการให้โหลดบริการระหว่างเวลาบูตในอนาคต เราจะต้องเปิดใช้งานบริการนั้น ถือเป็นบทสรุปที่ยอดเยี่ยมมาก! มาสร้างมันกันเถอะ มันง่ายมาก
หากคุณไปที่โฟลเดอร์:
cd /etc/systemd/system
ls -l
คุณสามารถดูไฟล์ลิงก์ของหน่วยบริการและไดเร็กทอรีบางส่วนของ “ต้องการ ” ของเป้าหมาย ตัวอย่างเช่น สิ่งที่เป้าหมายที่มีผู้ใช้หลายคนต้องการโหลดเมื่อขั้นตอนการบู๊ตถึงระดับนั้น จะแสดงอยู่ในไดเร็กทอรีชื่อ /etc/systemd/system/multi-user.target.wants/ .
ls multi-user.target.wants/
อย่างที่คุณเห็นว่าไม่ได้มีเพียงบริการเท่านั้น แต่ยังรวมถึงเป้าหมายอื่นๆ ซึ่งเป็นกลุ่มของบริการด้วย
มาสร้างหน่วยบริการด้วยชื่อ connection.service กันดีกว่า
vim connection.service
และพิมพ์ข้อความต่อไปนี้ (กด “i ”
เพื่อเข้าสู่โหมดแทรก) บันทึก และออก (ด้วย “esc ”
และ “:wq! ”
) :
[Unit]
Description = making network connection up
After = network.target
[Service]
ExecStart = /root/scripts/conup.sh
[Install]
WantedBy = multi-user.target
เพื่ออธิบายข้างต้น: เราได้สร้างหน่วยของประเภทบริการ (คุณสามารถสร้างหน่วยของประเภทเป้าหมายได้) และเราได้ตั้งค่าให้โหลดหลังจาก network.target (คุณสามารถเข้าใจได้ว่า ขั้นตอนการบูทไปถึงเป้าหมายด้วยลำดับที่กำหนดไว้) และเราต้องการทุกครั้งที่บริการเริ่มรันสคริปต์ทุบตีด้วยชื่อ conup.sh ที่เราจะสร้างขึ้น
ความสนุกเริ่มต้นด้วยส่วนสุดท้าย [ติดตั้ง] มันบอกว่ามันจะเป็นที่ต้องการโดย “multi-user.target ” ดังนั้นหากเราเปิดใช้งานบริการของเรา ลิงก์สัญลักษณ์ไปยังบริการนั้นจะถูกสร้างขึ้นภายในโฟลเดอร์ multi-user.target.wants! เข้าใจแล้ว? และหากเราปิดการใช้งานลิงก์นั้นจะถูกลบ ง่ายมาก
เพียงเปิดใช้งานและตรวจสอบ:
systemctl enable connection.service
โดยแจ้งให้เราทราบว่ามีการสร้างลิงก์สัญลักษณ์ในโฟลเดอร์ multi-user.target.wants แล้ว คุณสามารถยืนยันได้ด้วยการรันคำสั่ง ls ดังภาพ
ls multi-user.target.wants/
ดังที่คุณเห็น “connection.service ” พร้อมสำหรับการบูทครั้งถัดไป แต่เราต้องสร้างไฟล์สคริปต์ก่อน
cd /root
mkdir scripts
cd scripts
vim conup.sh
เพิ่มบรรทัดต่อไปนี้ภายใน Vim และบันทึก:
#!/bin/bash
nmcli connection up enp0s3
คำสั่ง nmcli เพื่อแสดงการเชื่อมต่อเครือข่ายสำหรับอินเทอร์เฟซ enp0s3
แน่นอน หากคุณต้องการให้สคริปต์ของคุณดำเนินการอย่างอื่น คุณสามารถพิมพ์อะไรก็ได้ที่คุณต้องการแทนบรรทัดที่สอง
ตัวอย่างเช่น,
#!/bin/bash
touch /tmp/testbootfile
ซึ่งจะสร้างไฟล์ภายในโฟลเดอร์ /tmp (เพียงเพื่อตรวจสอบว่าบริการของคุณใช้งานได้)
เรายังต้องทำให้สคริปต์ทำงานได้โดยการรันคำสั่ง chmod ดังที่แสดง
chmod +x conup.sh
ตอนนี้เราพร้อมแล้ว หากคุณไม่ต้องการรอจนกว่าจะบูตครั้งถัดไป (เปิดใช้งานแล้ว) เราสามารถเริ่มบริการสำหรับเซสชันปัจจุบันได้โดยพิมพ์:
systemctl start connection.service
เอาล่ะ! การเชื่อมต่อของฉันใช้งานได้แล้ว!
หากคุณเลือกที่จะเขียนคำสั่ง “touch /tmp/testbootfile ” ภายในสคริปต์ เพียงเพื่อตรวจสอบการทำงานของมัน คุณจะเห็นไฟล์นี้สร้างขึ้นภายในโฟลเดอร์ /tmp .
ฉันหวังเป็นอย่างยิ่งที่จะช่วยคุณทราบว่าบริการ ความต้องการ เป้าหมาย และการเรียกใช้สคริปต์ระหว่างการบูทเกี่ยวข้องกับอะไร