Computer >> คอมพิวเตอร์ >  >> ระบบ >> Linux

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

ในบทความนี้ เราจะเรียนรู้พื้นฐานเกี่ยวกับการกำหนดค่าบริการและสคริปต์ให้เริ่มทำงานโดยอัตโนมัติใน 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

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

คุณสามารถรับรายการไฟล์หน่วยโดยใช้คำสั่งนี้:

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 — แสดงรายการหน่วยที่เป็นบริการ

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

จะสร้างบริการใน 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.

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

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

เรียกใช้สคริปต์หรือบริการด้วย 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

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

แต่ฉันไม่ค่อยได้ใช้ rc.local เพื่อเริ่มบริการ บ่อยครั้งที่ rc.local ใช้เพื่อเริ่มสคริปต์หรือเรียกใช้คำสั่งเพียงครั้งเดียว

ตัวอย่างเช่น ฉันได้สร้างสคริปต์ /root/test.sh ที่ทำบางอย่างและฉันต้องการเรียกใช้ทันทีหลังจากบูต เพิ่มบรรทัดต่อไปนี้ในไฟล์ rc.local:

sh /root/test.sh

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

เริ่มต้นด้วย 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

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

จากนั้นฉันก็บันทึกไฟล์และเริ่มต้นเซสชัน SSH ใหม่:

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

อย่างที่คุณเห็น เมื่อเริ่มต้นเทอร์มินัล เว็บเซิร์ฟเวอร์ก็ถูกรีสตาร์ทด้วย ดำเนินการใดได้บ้างเมื่อเริ่มต้นเทอร์มินัล อาจเป็นเครื่องมือพิเศษบางอย่าง เช่น uptime ตรวจสอบเซิร์ฟเวอร์:

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

หรือถ้าคุณต้องการไปที่ไดเร็กทอรีที่ระบุและเริ่มต้น mc เมื่อเรียกใช้คอนโซล ssh ให้เพิ่มสิ่งต่อไปนี้ใน .bashrc :

cd /var/
mc

จะจัดการบริการและการเริ่มต้นสคริปต์บน CentOS/RHEL ได้อย่างไร

หวังว่าบทความนี้เกี่ยวกับวิธีการจัดการบริการ Linux หรือการเริ่มต้นสคริปต์ใน Linux จะเป็นประโยชน์กับคุณ (บทความนี้เขียนขึ้นสำหรับ CentOS และ RHEL แต่เหมาะสำหรับ distros อื่น ๆ ) ฉันแน่ใจว่าข้อมูลนี้จะเป็นประโยชน์สำหรับผู้ที่กำลังศึกษาพื้นฐานของการดูแลระบบ Linux