วิธีเรียกใช้โปรแกรม Linux เมื่อเริ่มต้นระบบด้วย systemd

เผยแพร่แล้ว: 2022-01-29
หน้าต่างเทอร์มินัลที่มีสไตล์บนแล็ปท็อป
Fatmawati Achmad Zaenuri/Shutterstock

ต้องการเปิดโปรแกรม Linux เมื่อบู๊ตหรือไม่? ซอฟต์แวร์ systemd มีวิธีการใช้งานบน Linux distro ใดๆ ที่มี systemd ซึ่งส่วนใหญ่เป็นซอฟต์แวร์ในทุกวันนี้ รวมถึง Ubuntu เราจะแนะนำคุณตลอดขั้นตอนการสร้างบริการแบบบูรณาการ—และแม้กระทั่งพูดคุยกับวารสาร

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

การรันโปรแกรมที่ Startup

ในบางครั้ง ซอฟต์แวร์ที่คุณติดตั้งบนคอมพิวเตอร์ของคุณจะเชื่อมโยงกับกระบวนการเริ่มต้นระบบ Linux เพื่อให้โปรแกรมเปิดทำงานโดยอัตโนมัติทุกครั้งที่เริ่มคอมพิวเตอร์ คุณสามารถบรรลุพฤติกรรมเดียวกันนี้ได้อย่างง่ายดายด้วยโปรแกรมและสคริปต์ของคุณเอง หรือที่จริงแล้วโปรแกรมอื่นใดที่อยู่ในคอมพิวเตอร์ของคุณ

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

โปรแกรมที่ทำงานอยู่เบื้องหลังเรียกว่า daemons หรือ services d ที่ท้าย systemd ย่อมาจาก daemon ในบทความนี้ เราจะสร้างบริการตัวอย่าง หากต้องการทำเครื่องหมายที่ช่องทั้งหมด บริการของเราจะต้อง:

  • ผสานรวมกับ systemd ผ่านไฟล์หน่วยบริการ
  • เปิดตัวเมื่อเริ่มต้น
  • ควบคุมได้โดยใช้ systemctl ซึ่งเป็นส่วนต่อประสานการควบคุมสำหรับ systemd
  • สามารถเขียนลงวารสารได้

การสร้างโปรแกรมบริการ

เราจำเป็นต้องมีโปรแกรมที่ systemd จะเปิดตัว เราจะสร้างสคริปต์อย่างง่ายที่เรียกว่า “htg.sh” บทช่วยสอนนี้ใช้โปรแกรมแก้ไขข้อความ Gedit แต่คุณสามารถใช้โปรแกรมแก้ไขข้อความใดก็ได้ที่คุณต้องการ

 แตะ htg.sh
 gedit htg.sh 

โฆษณา

ตัวแก้ไข gedit จะเปิดขึ้น คัดลอกและวางข้อความต่อไปนี้ลงในตัวแก้ไข

 #!/bin/bash

echo "htg.service: ## กำลังเริ่ม ##" | systemd-cat -p ข้อมูล

ในขณะที่ :
ทำ
TIMESTAMP=$(วันที่ '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p ข้อมูล
นอน 60
เสร็จแล้ว

บันทึกการเปลี่ยนแปลงของคุณและปิดตัวแก้ไข

สคริปต์ htg.sh ในตัวแก้ไข gedit

สคริปต์ไม่ได้ทำอะไรมากมาย แต่มีบางประเด็นที่ควรค่าแก่การสังเกต

  • echo สองบรรทัดถูกส่งผ่าน systemd-cat ซึ่งเป็นโปรแกรมที่รับเอาต์พุตจากโปรแกรมและส่งไปยังเจอร์นัล รายการในวารสารจะได้รับการจัดลำดับความสำคัญ เรากำลังใช้ตัวเลือก -p (ลำดับความสำคัญ) เพื่อระบุว่าข้อความของเรามีไว้สำหรับข้อมูล (ข้อมูล) เท่านั้น ไม่ใช่ข้อผิดพลาดหรือคำเตือนที่สำคัญ
  • มี while วนซ้ำไม่รู้จบ
  • ตัวแปร TIMESTAMP ถูกตั้งค่าเป็นวันที่และเวลาปัจจุบัน จัดรูปแบบเป็นข้อความและส่งไปยังวารสาร
  • สคริปต์จะเข้าสู่โหมดสลีปเป็นเวลา 60 วินาที
  • หลังจาก 60 วินาที ลูปจะวนซ้ำ ดังนั้น สคริปต์นี้จึงเขียนข้อความประทับเวลาไปยังวารสารหนึ่งครั้งต่อนาที

เราจะคัดลอกสคริปต์ไปที่ไดเร็กทอรี /usr/local/bin

 sudo cp htg.sh /usr/local/bin 

และเราจำเป็นต้องทำให้ปฏิบัติการได้:

 sudo chmod +x /usr/local/bin/htg.sh 

การสร้างไฟล์หน่วยบริการ

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

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

 sudo systemctl list-unit-files --type-service 

คุณสามารถเลื่อนดูรายการไฟล์หน่วย ซึ่งจัดเรียงตามตัวอักษร และตรวจสอบว่าไม่มีการใช้ชื่อที่คุณต้องการใช้

โฆษณา

บริการของเราจะเรียกว่า "htg.service" ไม่มีไฟล์หน่วยใดที่มีชื่อนั้น ดังนั้นเราจึงสามารถดำเนินการและสร้างไฟล์หน่วยของเราได้

 sudo gedit /etc/systemd/system/htg.service 

ตัวแก้ไข gedit จะเปิดขึ้น คัดลอกและวางข้อความต่อไปนี้ในโปรแกรมแก้ไข:

 [หน่วย]
Description=ตัวอย่างบริการ How-To Geek

ต้องการ=network.target
After=syslog.target network-online.target

[บริการ]
ประเภท=ง่าย
ExecStart=/usr/local/bin/htg.sh
รีสตาร์ท=on-failure
รีสตาร์ทวินาที=10
KillMode=กระบวนการ

[ติดตั้ง]
WantedBy=multi-user.target

บันทึกการเปลี่ยนแปลงของคุณและปิดตัวแก้ไข

ไฟล์หน่วย htg.service ในตัวแก้ไข gedit

รายการมีความหมายเหล่านี้ รายการเหล่านี้เป็นรายการทั่วไป บริการที่เรียบง่ายของเราไม่ได้ต้องการบริการส่วนใหญ่มากนัก แต่การรวมบริการเหล่านี้จะช่วยให้เราอธิบายได้

  • คำอธิบาย: นี่คือคำอธิบายข้อความของบริการของคุณ
  • ต้องการ: บริการของเราต้องการ—แต่ไม่ต้องการ—เครือข่ายต้องทำงานก่อนเริ่มบริการของเรา
  • หลัง: รายชื่อยูนิตที่ควรเริ่มต้นหลังจากเริ่มบริการนี้สำเร็จแล้ว หากยังไม่ได้เปิดใช้งาน
  • ประเภท: ง่าย. systemd จะพิจารณาบริการนี้เริ่มต้นทันทีที่กระบวนการที่ระบุโดย ExecStart ได้รับการแยก
  • ExecStart: เส้นทางไปยังกระบวนการที่ควรเริ่มต้น
  • รีสตาร์ท: ควรเริ่มบริการใหม่เมื่อใดและหาก เราได้ตั้งค่าเป็น "เมื่อล้มเหลว"
  • RestartSec: ระยะเวลารอก่อนที่จะพยายามเริ่มบริการใหม่ ค่านี้เป็นหน่วยวินาที
  • KillMode: กำหนดวิธีที่ systemd ควรฆ่ากระบวนการหากเราขอให้ systemctl หยุดบริการ เรามีชุดนี้เป็น "กระบวนการ" สิ่งนี้ทำให้ systemd ใช้สัญญาณ SIGTERM บนกระบวนการหลักเท่านั้น หากบริการของเราเป็นโปรแกรมที่ไม่สำคัญแทนที่จะเป็นสคริปต์ธรรมดา เราจะตั้งค่านี้เป็น "แบบผสม" เพื่อให้แน่ใจว่ากระบวนการที่เกิดจะถูกยกเลิกด้วย
  • ต้องการโดย: เรามีการตั้งค่านี้เป็น "ผู้ใช้หลายคน. เป้าหมาย" ซึ่งหมายความว่าบริการควรเริ่มต้นได้ตราบเท่าที่ระบบอยู่ในสถานะที่ผู้ใช้หลายคนสามารถเข้าสู่ระบบได้ ไม่ว่าจะมีอินเทอร์เฟซผู้ใช้แบบกราฟิกหรือไม่ก็ตาม

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

คำสั่งนี้จะให้สิทธิ์ในการอ่านและเขียนแก่เจ้าของ และสิทธิ์ในการอ่านไปยังกลุ่ม คนอื่นจะไม่มีสิทธิ์

 sudo chmod 640 /etc/systemd/system/htg.service 

เราสามารถให้ systemctl ตรวจสอบไวยากรณ์ของไฟล์หน่วยของเราให้เราได้ แม้ว่าบริการจะยังไม่ทำงานก็ตาม ข้อผิดพลาดใด ๆ จะถูกรายงาน (อันที่จริง ส่วน ".service" เป็นทางเลือกสำหรับคำสั่งส่วนใหญ่)

 สถานะ systemctl htg.service 

โฆษณา

ไม่มีการเน้นข้อผิดพลาด ซึ่งหมายความว่าไฟล์หน่วยของเราถูกต้องตามหลักไวยากรณ์

เริ่มบริการ

เมื่อคุณเพิ่มไฟล์ยูนิตใหม่หรือแก้ไขไฟล์ที่มีอยู่ คุณต้องบอกให้ systemd โหลดข้อกำหนดไฟล์ยูนิตใหม่

 sudo systemctl daemon-reload

หากคุณต้องการเปิดบริการเมื่อเริ่มต้น คุณต้อง เปิดใช้ งาน:

 sudo systemctl เปิดใช้งาน htg

การเปิดใช้งานบริการไม่ได้เริ่มต้นขึ้น แต่จะตั้งค่าให้เปิดใช้งานในเวลาบูตเท่านั้น ในการเริ่มบริการทันที คุณ ต้องใช้ systemctl พร้อมตัวเลือกการ start

 sudo systemctl start htg 

กำลังตรวจสอบบริการ

หลังจากเริ่มบริการด้วยตนเองหรือหลังจากรีบูตเครื่องคอมพิวเตอร์ เราสามารถยืนยันได้ว่าบริการของเราทำงานอย่างถูกต้อง

 สถานะ sudo systemctl htg.service 

สถานะของบริการจะแสดงให้เราทราบ

สถานะของ htg.service ในเทอร์มินัล widnow

  • จุดสีเขียวหมายความว่าบริการของเราทำงานได้อย่างราบรื่น
  • ชื่อของบริการคือ "htg.service" และคำอธิบายแบบยาวคือชื่อที่เราให้ไว้ในไฟล์หน่วย
  • เราพบว่าไฟล์หน่วยใดถูกโหลด “/etc/systemd/system/htg.service”
  • บริการนี้เปิดใช้งานอยู่ และเวลาที่เปิดตัวบริการนั้นแสดงไว้สำหรับเรา
  • PID ของมันคือ 7762
  • มีสองงานที่เกี่ยวข้องกับบริการ
  • บริการใช้หน่วยความจำทั้งหมด 928 กิบิไบต์
  • กลุ่มควบคุมประกอบด้วยสคริปต์ "htg.sh" และคำสั่ง sleep ซึ่งเปิดตัวโดย "htg.sh" โดยส่วนใหญ่ คำสั่ง sleep จะทำงานสำหรับบริการนี้

เรายังแสดงรายการบันทึกประจำวัน 10 รายการล่าสุดที่จัดทำโดยบริการนี้ ไม่น่าแปลกใจเลยที่พวกเขาทั้งหมดห่างกันหนึ่งนาที

การหยุดและปิดใช้งานบริการ

หากคุณต้องการหยุดบริการ คุณสามารถทำได้ด้วยคำสั่งนี้:

 sudo systemctl หยุด htg.service 

โฆษณา

การดำเนินการนี้จะหยุดบริการ แต่ไม่ได้ป้องกันไม่ให้รีสตาร์ทในครั้งต่อไปที่คอมพิวเตอร์รีบูต หากต้องการหยุดให้บริการเมื่อเริ่มต้น คุณต้อง ปิดการใช้งาน :

 sudo systemctl ปิดการใช้งาน htg.service 

หากบริการกำลังทำงาน คำสั่งนี้จะไม่หยุดการทำงาน มันแค่บอก systemd ว่าจะไม่เปิดบริการเมื่อรีบูตครั้งถัดไป

หากคุณต้องการหยุดบริการและป้องกันไม่ให้เปิดเมื่อเริ่มต้น ให้ใช้ทั้งสองคำสั่ง

เคล็ดลับการบริการ

ตรวจสอบให้แน่ใจว่าโปรแกรมของคุณทำงานตามที่คาดไว้ก่อนที่คุณจะพยายามเปิดเป็นบริการ

ที่เกี่ยวข้อง: แล็ปท็อป Linux ที่ดีที่สุดสำหรับนักพัฒนาและผู้ที่ชื่นชอบ