ความแตกต่างระหว่าง systemctl init.d และบริการ


39

ฉันใหม่สำหรับ linux และได้ทำการทดสอบตัวเองโดยใช้อินสแตนซ์ Amazon Lightsail (Ubuntu 16.04 LTS)

จากคำแนะนำมากมายที่ฉันเจอฉันเห็นคนที่ใช้คำสั่งต่าง ๆ เพื่อเริ่ม / หยุด / เริ่มใหม่ / โหลดซ้ำ / เปลี่ยนสถานะ - ตรวจสอบบริการ โดยเฉพาะสิ่งเหล่านี้

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

คำสั่งข้างต้นทั้งหมดทำงาน

  1. ฉันควรเลือกคำสั่งเดียวมากกว่าคำสั่งอื่นหรือไม่
  2. ถ้าใช่แล้วทำไม
  3. มีคำสั่งอื่น ๆ ที่ฉันต้องระวังหรือไม่?

การใช้ init.d ใน Monit ทำให้เกิดปัญหาเมื่อฉันต้องการใช้ตัวเลือกสถานะ (สถานะจะเป็นว่าบริการออฟไลน์เมื่อมันออนไลน์จริง ๆ - เริ่มต้นใหม่โดย Monit) เปลี่ยนรหัสใน Monit จาก inid.d เป็น / bin / systemctl แก้ไข

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

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

ฉันอยากจะขอบคุณทุกคนล่วงหน้าที่ใช้เวลาในการอ่านและตอบคำถามนี้


ใน Linux มักจะมีวิธีการดำเนินการมากกว่าหนึ่งวิธี ไม่มีใครที่ดีกว่าหรือแย่กว่าหรือถูกหรือผิด ส่วนตัวผมใช้อันที่พิมพ์น้อยที่สุด คำสั่งเหล่านี้จำนวนมากอาจเป็นลิงค์ sym หรือสำรองความเข้ากันได้เมื่อ Ubuntu เปลี่ยนเป็น systemd
Panther

systemctlเป็นไวยากรณ์ที่ต้องการและserviceมีให้เป็นความเข้ากันได้ย้อนหลัง /etc/init.d/pure-ftpdหรือคล้ายกันกำลังเรียกสคริปต์เริ่มต้น / หยุดโดยตรง
Panther

คำตอบ:


57

ในการเริ่มต้นมีประวัติความเป็นมาทั้งหมดและการต่อสู้ระหว่างไปจากการSysVInit SystemDแทนที่จะพยายามทำลายสิ่งนั้นลงในคำตอบเดียวฉันจะแนะนำคุณไปยัง google venturing เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับประวัติรวมถึงบทความหนึ่งในหัวข้อ:

http://www.tecmint.com/systemd-replaces-init-in-linux/

โดยสรุปแล้วมันเป็นการเปลี่ยนแปลงที่ช้าและยากลำบาก คุณลักษณะดั้งเดิมบางอย่างยังคงเหมือนเดิม (เช่นในinit.dระดับหนึ่ง) หากคุณมีตัวเลือกที่จะใช้systemctlสำหรับการควบคุมบริการของคุณฉันขอแนะนำให้ใช้ตัวควบคุมนั้น มันเป็นอนาคตที่มองเห็นได้สำหรับลีนุกซ์และในที่สุดSysVInitวิธีที่เก่ากว่าจะถูกพิจารณาว่าเลิกใช้แล้วและถูกลบทิ้งทั้งหมด

เพื่อให้ครอบคลุมแต่ละรายการที่คุณระบุไว้:

  1. sudo systemctl status apache2.service

นี่คือSystemDวิธีการใหม่ในการจัดการบริการ ก้าวไปข้างหน้าแอพพลิเคชั่นบน Linux ได้รับการออกแบบให้ใช้เมธอด systemd ไม่ใช่อย่างอื่น

  1. sudo /bin/systemctl status apache2.service

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

  1. sudo /etc/init.d/apache2 status

นี่เป็นSysVInitวิธีดั้งเดิมในการเรียกใช้บริการ สคริปต์เริ่มต้นจะถูกเขียนสำหรับบริการและวางลงในไดเรกทอรีนี้ ในขณะที่วิธีนี้ยังคงใช้โดยหลายคนserviceเป็นคำสั่งที่แทนที่วิธีการโทรในบริการSysVInitนี้ มีฟังก์ชั่นดั้งเดิมบางอย่างสำหรับสิ่งนี้ในระบบที่ใหม่กว่าด้วยSystemDแต่โปรแกรมที่ใหม่กว่าส่วนใหญ่จะไม่รวมถึงสิ่งนี้และไม่ใช่สคริปต์ init ของแอปพลิเคชันที่เก่ากว่าทั้งหมดที่ใช้งานได้

  1. sudo service apache2 status

นี่เป็นเครื่องมือหลักที่ใช้ในSysVInitระบบสำหรับการบริการ ในบางกรณีมันเพิ่งเชื่อมโยงกับ/etc/init.d/สคริปต์ แต่ในบางกรณีมันไปที่สคริปต์ init ที่เก็บไว้ที่อื่น มันมีจุดมุ่งหมายเพื่อให้การเปลี่ยนแปลงที่ราบรื่นในการจัดการการพึ่งพาบริการ


สุดท้ายคุณพูดถึงต้องการทราบวิธีการรับข้อมูลเพิ่มเติมจากคำสั่งเนื่องจากบางคนให้ข้อมูลมากกว่าคนอื่น ๆ สิ่งนี้ถูกกำหนดโดยแอปพลิเคชั่นเกือบทุกครั้งและวิธีที่พวกเขาออกแบบ init หรือ service file ตามกฎทั่วไปว่าถ้ามันเสร็จสมบูรณ์เงียบมันก็ประสบความสำเร็จ อย่างไรก็ตามในการตรวจสอบstart, stopหรือrestartคุณสามารถใช้statusคำสั่งย่อยเพื่อดูว่ามันจะทำ คุณพูดถึงstatusคำสั่งที่ไม่ถูกต้องในสคริปต์ init เก่า นั่นเป็นข้อผิดพลาดที่นักพัฒนาแอปพลิเคชันจะต้องดู อย่างไรก็ตามเนื่องจากสคริปต์ init กำลังกลายเป็นวิธีการที่ไม่รองรับการใช้งานบริการพวกเขาอาจเพิกเฉยข้อบกพร่องได้จนกว่าจะลบตัวเลือกสคริปต์ init ทั้งหมด systemctl status ควรทำงานอย่างถูกต้องมิฉะนั้นข้อผิดพลาดควรถูกบันทึกไว้กับนักพัฒนาแอปพลิเคชัน


ขอบคุณมากสำหรับการตอบกลับอย่างละเอียด ฉันเป็น Googling สำหรับคำตอบ แต่อันนี้ฉันสับสนจริงๆดังนั้นฉันโพสต์ไว้ที่นี่ ฉันยังเห็นว่า sudo systemctl status apache2 ทำงานแทน (sudo systemctl status apache2.service) จะมีอันตรายในการมาก่อนส่วนบริการ.
Waqas Tariq

@WaqasTariq ไม่มีปัญหา! ทั้งsystemctlคู่ควรทำงานได้จะค้นหาไดเรกทอรีที่เก็บไฟล์บริการและเพิ่ม ".service" ให้คุณหากพบ ตัวอย่างเช่นหากคุณกดแท็บหนึ่งครั้งหลังจากเขียนsudo systemctl status apache2เสร็จก็ควรทำให้เสร็จโดยเพิ่ม.serviceให้คุณ หากมีมากกว่าหนึ่งไฟล์ apache2 systemctl (เช่น.serviceและ.targetคุณจะต้องกด tab สองครั้งเพื่อให้มันแสดงตัวเลือกที่มีทั้งหมด
TopHat

เข้าใจแล้ว. ขอบคุณสำหรับคำตอบและเวลาของคุณ
Waqas Tariq

@WaqasTariq ยินดีต้อนรับคุณ!
TopHat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.