ค้นหาเว็บไซต์

วิธีสร้างและเรียกใช้หน่วยบริการใหม่ใน 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 .

ฉันหวังเป็นอย่างยิ่งที่จะช่วยคุณทราบว่าบริการ ความต้องการ เป้าหมาย และการเรียกใช้สคริปต์ระหว่างการบูทเกี่ยวข้องกับอะไร