ในบทความนี้ เราจะเรียนรู้พื้นฐานเกี่ยวกับการกำหนดค่าบริการและสคริปต์ให้เริ่มทำงานโดยอัตโนมัติใน Linux CentOS/RHEL 7/8 โดยเฉพาะอย่างยิ่ง เราจะมาทำความรู้จักกับ systemd daemon เรียนรู้วิธีเพิ่มหรือลบบริการออกจากการเริ่มต้นระบบ และพิจารณาทางเลือกอื่นในการเริ่มสคริปต์หรือ daemons ในการบู๊ตใน Linux
บทความนี้มีจุดมุ่งหมายเพื่อสอนให้คุณค้นหารายการบริการหรือสคริปต์ที่เริ่มโดยอัตโนมัติใน Linux ได้อย่างรวดเร็ว เพิ่มบริการหรือสคริปต์เพื่อเริ่มต้นหรือปิดใช้งานการเริ่มต้นอัตโนมัติของบางแอป
การใช้ Systemctl เพื่อจัดการบริการ Systemd ใน Linux
Linux distros ยอดนิยม (CentOS, RHEL, Debian, Fedora และ Ubuntu) ใช้ systemd startup daemon แทน init.d . ระบบ เป็นตัวจัดการบริการ Linux ที่ใช้ในการเริ่มต้น daemons อื่นและจัดการ มันใช้ไฟล์หน่วยจาก /etc/systemd/system
(init.d สคริปต์ที่ใช้จาก /etc/init.d/
). Systemd ช่วยให้คุณสามารถเริ่มต้นบริการขนานในการบูตระบบปฏิบัติการ
ในการจัดการ systemd systemctl ใช้คำสั่ง
ก่อนอื่น หลังจากบูทระบบ เราจะตรวจสอบรายการยูนิตที่มีใน systemd :
systemctl list-units
คุณสามารถรับรายการไฟล์หน่วยโดยใช้คำสั่งนี้:
systemctl list-unit-files
คำสั่งนี้จะแสดงไฟล์หน่วยที่มีอยู่ทั้งหมด
หากต้องการแสดงรายการบริการที่ใช้งานอยู่และสถานะของบริการ ให้เรียกใช้คำสั่งนี้:
# systemctl list-units -t service
เนื่องจากบางหน่วยอาจใช้งานไม่ได้หลังจากการเริ่มต้น คุณสามารถรับรายการทั้งหมดได้โดยใช้ปุ่ม —ทั้งหมด ตัวเลือก
# systemctl list-units --all
UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-fs-binfmt_misc.automount loaded active waiting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ● exim.service not-found inactive dead exim.service firewalld.service loaded active running firewalld - dynamic firewall daemon [email protected] loaded active running Getty on tty1 ● iptables.service not-found inactive dead iptables.service Bring up/down networking ● NetworkManager-wait-online.service not-found inactive dead
ดังที่คุณเห็นจากรายการ แม้แต่บริการที่ไม่พบในดิสก์ก็ยังแสดงอยู่
นอกจากนี้ คุณสามารถใช้แฟล็กอื่นๆ เช่น:
- —สถานะ — ใช้เพื่อตรวจจับสถานะ daemon:Load, Active, Sub
- —พิมพ์ — อนุญาตให้กรองหน่วยตามประเภท
ตัวอย่าง:
systemctl list-units --all --state=active
—แสดงรายการของหน่วย systemd ที่ใช้งานอยู่เท่านั้น
systemctl list-units —type=service
— แสดงรายการหน่วยที่เป็นบริการ
จะสร้างบริการใน Systemd ได้อย่างไร
ในการจัดการบริการ systemd ใช้ไวยากรณ์พิเศษ คุณต้องเพิ่ม .service หลังชื่อของบริการ ตัวอย่างเช่น:
# systemctl enable nginx.service
– คำสั่งเพิ่มเว็บเซิร์ฟเวอร์ nginx เพื่อเริ่มต้น
คำสั่งนี้จะสร้างลิงก์สัญลักษณ์ไปยังไฟล์ที่ระบุในคำสั่งบริการใน systemd ไดเรกทอรีเริ่มต้น
# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.serviceผลลัพธ์ของคำสั่งแสดงไดเร็กทอรีซึ่งสร้าง symlink ไปยังไฟล์บริการ
เพื่อตรวจสอบว่ามีการเพิ่มบริการในการเริ่มต้นหรือไม่ คุณจะได้รับสถานะ:
systemctl status nginx.service
สังเกตบรรทัดต่อไปนี้ในผลลัพธ์:
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
เปิดใช้งาน ค่าหมายความว่าบริการนี้ถูกเพิ่มในการเริ่มต้น Linux หากบริการไม่เริ่มต้นโดยอัตโนมัติ คุณจะเห็น ปิดการใช้งาน ที่นี่.
จะปิดการใช้งานบริการใน Systemd ได้อย่างไร
คุณสามารถลบบริการออกจากการเริ่มต้นเพื่อที่จะไม่เริ่มทำงานบน Linux boot (ในขณะที่ตัวบริการเองจะไม่ถูกลบออก) หากต้องการปิดใช้งานการเริ่มต้นบริการ ให้เรียกใช้คำสั่งต่อไปนี้:
# systemctl disable your_service
ตัวอย่างเช่น หากต้องการปิดใช้งาน nginx autostartup:
# systemctl disable nginx.service
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service
หลังจากทำเสร็จแล้ว symlink ไปยังไฟล์บริการจะถูกลบออกจากไดเร็กทอรี systemd คุณสามารถตรวจสอบได้ว่าบริการจะเริ่มต้นโดยอัตโนมัติหรือไม่:
# systemctl is-enabled nginx
วิธีการปิดบังยูนิตด้วย Systemd
ฉันพบบริการที่ชั่วร้ายบางอย่างที่ยังคงอยู่ในการเริ่มต้นระบบหลังจากปิดใช้งานและเริ่มหลังจากรีบูต Linux ในการแก้ปัญหานี้ คุณสามารถปิดบังบริการได้:
# systemctl mask nginx.service
จากนั้นระบบจะไม่เริ่มทำงานด้วยตนเองหรือหลังจากรีสตาร์ทระบบปฏิบัติการ:
# systemctl mask nginx.service
Created symlink from /etc/systemd/system/nginx.service to /dev/null.
# service nginx restart
Redirecting to /bin/systemctl restart nginx.service Failed to restart nginx.service: Unit is masked.
คุณสามารถเปิดโปงบริการโดยใช้คำสั่งนี้:
# systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.
หากหลังจากปิดบังบริการแล้ว คุณตรวจสอบไฟล์หน่วยของคุณ คุณจะเห็นว่าบริการนั้นถูกทำเครื่องหมายเป็น ปิดบัง :
เรียกใช้สคริปต์หรือบริการด้วย Rc.local
หากต้องการเรียกใช้สคริปต์ต่างๆ ในการบูต Linux rc.local มักใช้
นอกจากสคริปต์แล้ว ใช้ rc.local คุณสามารถเรียกใช้บริการได้เช่นกัน แม้แต่บริการที่เริ่มใช้ systemd . ฉันไม่รู้ว่าทำไมคุณควรใช้ rc.local หากมี systemd แต่นี่เป็นตัวอย่างสองสามตัวอย่าง
ก่อนอื่น /etc/rc.local จะต้องปฏิบัติการได้:
chmod +x /etc/rc.local
ต้องเพิ่ม Rc.local ในการเริ่มระบบอัตโนมัติ:
systemctl enable rc-local
และเราสามารถเพิ่มคำสั่งเพื่อเริ่ม nginx เว็บเซิร์ฟเวอร์ไปยัง rc.local :
service nginx start
แต่ฉันไม่ค่อยได้ใช้ rc.local เพื่อเริ่มบริการ บ่อยครั้งที่ rc.local ใช้เพื่อเริ่มสคริปต์หรือเรียกใช้คำสั่งเพียงครั้งเดียว
ตัวอย่างเช่น ฉันได้สร้างสคริปต์ /root/test.sh ที่ทำบางอย่างและฉันต้องการเรียกใช้ทันทีหลังจากบูต เพิ่มบรรทัดต่อไปนี้ในไฟล์ rc.local:
sh /root/test.sh
เริ่มต้นด้วย CentOS 7 นักพัฒนาชี้ให้เห็นว่า rc.local เป็น daemon ที่ล้าสมัยและไม่แนะนำให้ใช้เพื่อเริ่มสคริปต์หรือบริการ แต่ฉันใช้มันในขณะที่มันยังคงทำงานอยู่เพราะมันง่ายมาก
จะสร้างบริการ Linux ด้วย Systemd ได้อย่างไร
คุณสามารถสร้าง daemon ของคุณเองและจัดการได้ผ่าน systemd.
ตัวอย่างเช่น คุณต้องการเริ่มสคริปต์เดียวกัน (/root/test.sh ) ทุกครั้งที่ระบบรีบูต เริ่มต้นด้วยการสร้างไฟล์บริการใหม่ของเรา:
touch /etc/systemd/system/test-script.service
chmod 664 /etc/systemd/system/test-script.service
nano /etc/systemd/system/test-script.service
นี่คือเนื้อหาของไฟล์:
[Unit] Description=Template Settings Service After=network.target [Service] Type=oneshot User=root ExecStart=/root/test.sh [Install] WantedBy=multi-user.target
พารามิเตอร์หลักคือ:
User
– บัญชีผู้ใช้ที่ภูตเริ่มต้นจาก
Type=oneshot
— systemd ควรรอให้กระบวนการสิ้นสุดก่อนดำเนินการต่อกับหน่วยอื่น
ตรวจสอบและเริ่มต้นใหม่:# systemctl daemon-reload
# systemctl start test-script.service
# systemctl status test-script.service
● test-script.service - Test Loaded: loaded (/etc/systemd/system/test-script.service; disabled; vendor preset: disabled) Active: active (running)
หากบริการใช้งานได้ดี ให้เพิ่มไปที่ systemd startup :
# systemctl enable test-script.service
Created symlink from /etc/systemd/system/multi-user.target.wants/test-script.service to /etc/systemd/system/test-script.service.
ดังนั้น คุณสามารถเพิ่มสคริปต์เพื่อเริ่มต้นอัตโนมัติและจัดการผ่าน systemd ได้
จะเรียกใช้สคริปต์โดยใช้ Cron ได้อย่างไร
หากคุณต้องการเรียกใช้สคริปต์หรือคำสั่งที่ความถี่ใดระดับหนึ่ง คุณสามารถใช้ cron :
crontab -e
— เปิดตัวแก้ไขเพื่อเปลี่ยนตารางงาน cron
และเพิ่มงานที่คุณต้องการที่นี่ เช่น:
* * * * * /root/test.sh
— เพื่อเรียกใช้สคริปต์นาทีละครั้ง
คุณสามารถเขียน สุนัขเฝ้าบ้าน สคริปต์ที่จะตรวจสอบสถานะการบริการ และหากบริการไม่ทำงาน สคริปต์จะเริ่มทำงาน ฉันกำลังใช้วิธีเดียวกันในบางโครงการของฉัน
หากต้องการแสดงรายการงานทั้งหมดใน cron ให้รันคำสั่ง:
# crontab -l
* * * * * /root/test.sh
ค่าเวลาที่พร้อมใช้งานเพื่อรันงาน cron ตามลำดับ:
- นาที:0-59
- เวลาทำการ:0-59
- วันของเดือน:1-31
- เดือน:1-12
- วันในสัปดาห์:0-7 (0 หรือ 7 คือวันอาทิตย์)
ในงานของเรา สคริปต์จะทำงานนาทีละครั้ง จึงมี *ดอกจัน* อยู่ที่นั่น
คุณยังสามารถวางสคริปต์ใน cron . ตัวใดตัวหนึ่งได้ ไดเรกทอรี:
- /cron.daily – สำหรับสคริปต์ที่ทำงานวันละครั้ง
- /cron.hourly – สำหรับสคริปต์ที่ทำงานทุกๆ ชั่วโมง
- /cron.monthly — สำหรับสคริปต์ที่ทำงานเดือนละครั้ง
- /cron.weekly — สำหรับสคริปต์ที่ทำงานสัปดาห์ละครั้ง
สคริปต์ในไดเร็กทอรีที่ระบุจะถูกรันตามกำหนดการอัตโนมัติ
สคริปต์เริ่มต้นของ Bash:.bashrc
หากคุณต้องการดำเนินการบางอย่างเมื่อเริ่มต้น SSH console คุณสามารถเพิ่มคำสั่งหรือสคริปต์ใดก็ได้ใน .bash_profile หรือ .bashrc ไฟล์. ในทางทฤษฎี คุณสามารถเพิ่มการดำเนินการลงในไฟล์เหล่านี้ได้ ไฟล์จะถูกเรียกใช้ในทุกกรณี โดยปกติ สิ่งที่คุณต้องการจะถูกเพิ่มใน .bashrc และ .bashrc จะเริ่มต้นจาก .bash_profile
ฉันเพิ่มคำสั่งเพื่อเริ่มบริการเว็บ nginx ใหม่เป็นไฟล์ .bashrc:
service nginx restart
จากนั้นฉันก็บันทึกไฟล์และเริ่มต้นเซสชัน SSH ใหม่:
อย่างที่คุณเห็น เมื่อเริ่มต้นเทอร์มินัล เว็บเซิร์ฟเวอร์ก็ถูกรีสตาร์ทด้วย ดำเนินการใดได้บ้างเมื่อเริ่มต้นเทอร์มินัล อาจเป็นเครื่องมือพิเศษบางอย่าง เช่น uptime ตรวจสอบเซิร์ฟเวอร์:
หรือถ้าคุณต้องการไปที่ไดเร็กทอรีที่ระบุและเริ่มต้น mc เมื่อเรียกใช้คอนโซล ssh ให้เพิ่มสิ่งต่อไปนี้ใน .bashrc :
cd /var/
mc
หวังว่าบทความนี้เกี่ยวกับวิธีการจัดการบริการ Linux หรือการเริ่มต้นสคริปต์ใน Linux จะเป็นประโยชน์กับคุณ (บทความนี้เขียนขึ้นสำหรับ CentOS และ RHEL แต่เหมาะสำหรับ distros อื่น ๆ ) ฉันแน่ใจว่าข้อมูลนี้จะเป็นประโยชน์สำหรับผู้ที่กำลังศึกษาพื้นฐานของการดูแลระบบ Linux