มีวิธีมาตรฐานในการเริ่มและหยุดบริการบน Linux หรือไม่?


15

จนกระทั่งเมื่อเร็ว ๆ นี้มีวิธีที่ง่ายและมีประสิทธิภาพในการเริ่ม / หยุด / เริ่มบริการใหม่:

service nginx start|stop|restart

นี้ทำงานที่ดีเลิศสำหรับหลายปีดังนั้น ... จนกระทั่งบางกางเกงสมาร์ทตัดสินใจที่จะปรับปรุงพวกเขาและตอนนี้ฉันกำลังหันหน้าไปกับระบบ Debian / Ubuntu ที่serviceสคริปต์ไม่ทำอะไรเลย (ตามที่ฉันควรจะใช้สิ่งที่ชอบsystemctl start nginx.service(มากอีกต่อไป ไม่ทำงานอัตโนมัติให้เสร็จสมบูรณ์ ... )

คำถามของฉันอ้างถึง Debian และ Ubuntu เป็นพิเศษ แต่มันจะมีประโยชน์ในการครอบคลุม CentOS / RedHat distros ด้วย

ดังนั้นมีบางสิ่งที่สามารถช่วยฉันจากการเปลี่ยนแปลงในวาระนี้ได้หรือไม่?

ในกรณีที่มันไม่ชัดเจนฉันกำลังมองหาวิธีที่สอดคล้องกันในการจัดการกับสิ่งเหล่านั้นซึ่งจะทำงานบน Debian 7.x, 8.x, Ubuntu LTS ล่าสุดและ non-LTS

PS อยู่นอกขอบเขตของคำถามที่เฉพาะเจาะจงนี้ แต่ความรุ่งโรจน์พิเศษที่ได้รับหากการแก้ปัญหาจะครอบคลุมส่วนที่เปิดใช้งานและปิดการใช้งานสำหรับบริการ


5
การทำให้แท็บสมบูรณ์สำหรับ systemctl สำหรับฉัน ... และไม่ว่า systemdl จะเป็นมาตรฐานจริงหรือไม่ในตอนนี้: และอาจคุ้นเคยกับมัน
jasonwryan

1
พิเศษ: ถ้าคำสั่งบริการไร้ประโยชน์ฉันสามารถลบมันได้หรือไม่ มีแพ็คเกจอะไรบ้าง?
โซริน

3
ไม่เหมาะสมที่จะแทนที่serviceคำสั่งเก่าด้วย wrapper ที่เรียกใช้ servicectl แทนใช่หรือไม่
โซริน

4
@ jasonwryan ใช่ แต่คุณก็สามารถทำเช่นนั้นได้และเสื้อคลุมสามารถจัดการกับมันได้ทำให้การเปลี่ยนไปใช้ systemd ราบรื่นขึ้นสำหรับผู้ใช้
Dmitry Grigoryev

2
ไม่serviceทำอะไรให้คุณจริงๆเหรอ? มันทำงานได้ตามที่คาดหวังใน LMDE ของฉัน (ซึ่งโดยพื้นฐานแล้วเป็นการทดสอบเดเบียน) ฉันไม่คิดว่านั่นเป็นสิ่งที่เฉพาะเจาะจงของ LMDE มันทำงานได้อย่างที่คาดไว้ใน Ubuntu VM ของฉัน
terdon

คำตอบ:


6

มีระบบควบคุมการบู๊ตและบริการที่หลากหลายบนแพลตฟอร์ม Unix ในประวัติศาสตร์ที่ยุ่งเหยิง

service\chkconfigตามระบบที่คุณพบง่ายและมีประสิทธิภาพโดยทั่วไปจะเรียกว่าเป็นsysvinitสไตล์และเป็นขั้นตอนที่สำคัญไปพร้อมกันเพื่อการจัดเรียงของมาตรฐานบางอย่าง คุณจะพบรูปแบบการบูตแบบนี้บน RHEL / CentOS (EL) ถึงรุ่น 6, Fedora ถึง 14 และรุ่น Debian / Ubuntu จนถึงปี 2015 มันไม่ใช่ระบบบูตเพียงอย่างเดียว แต่สไตล์ BSD (ง่ายกว่า) ระบบ init ยังคงมีแฟน ๆ จำนวนมาก

SysVinit ไม่ใช่โซลูชันที่สมบูรณ์แบบ (คืออะไร) และSystemdได้รับการออกแบบเพื่อเอาชนะปัญหาต่างๆ นี่คือsystemctlระบบตามคำสั่งที่คุณกำลังประสบอยู่ ถึงแม้ว่ามันจะไม่เป็นที่ชื่นชอบในระดับสากล (คนเกลียดการเปลี่ยนแปลงขยายตัว ฯลฯ ) ไม่ต้องสงสัยเลยว่ามันจะกลายเป็นมาตรฐาน defacto อย่างรวดเร็วในการกระจายส่วนใหญ่

ดังนั้นการมองไปข้างหน้าทันทีคำตอบสำหรับคำถามเดิมของคุณเป็นเพียง: มาตรฐานวิธีการที่จะควบคุมการให้บริการข้ามมากที่สุดลินุกซ์อยู่ในขณะนี้! นานแค่ไหนที่จะถือเป็นจริงก็คือทุกคนคาดเดา; อาจจนกว่าจะมีบางสิ่งมาพร้อมกันนั้นดีกว่าและกลายเป็นลูกบุญธรรมอย่างกว้างขวาง
systemctl

ฉันแน่ใจว่าจะมีการห่อหุ้มที่อนุญาตให้คุณชื่นชอบในปัจจุบันservice/chkconfigคำสั่งที่จะดำเนินการส่วนใหญ่มีเหตุผล แต่ด้วยเส้นโค้งการเรียนรู้นี้โดยเฉพาะมันอาจจะดีที่สุดที่จะไม่ต่อสู้ อาจจะมองไปข้างหน้าสักพักหนึ่งก็จะมีระบบsystemctlห่อหุ้มสำหรับระบบเก่า ๆ เพื่อจัดการกับพวกมันควบคู่ไปกับคนที่มีความเจ็บปวดน้อยกว่า;)


และก่อนหน้านี้คือ xinetd และก่อนหน้านั้นคือ inetd
jas-

@ jas- ฉันคิดว่า inetd เป็นบริการตัวเองจริงๆฉันเชื่อว่าพวกเขาสามารถมีอยู่ในทุกระบบการบูต เป็นบริการพิเศษที่ให้ทางเลือกสำหรับบริการอื่น ๆ ในการทำงานเป็นบริการเต็มรูปแบบโดยให้บริการตามความต้องการแทน ฉันเข้าใจว่าคุณมาจากไหนในบริบทของคำถามนี้แม้ว่าจะเป็นอีกหนึ่งวิธีในการเริ่มบริการ
DanSut

ในการแจกแจงทั้งหมด gentoo, centos, redhat, debian, ubuntu ฯลฯ , xinetd และ inetd ก่อนหน้านี้ประกอบด้วยเชลล์สคริปต์ขนาดเล็กเพื่อเริ่มหยุดและโหลดการกำหนดค่าใหม่สำหรับบริการต่างๆ แต่ใช่คุณถูกต้องพวกเขาเป็นบริการที่เหมือนกับ systemd
jas-

Ubuntu ใช้ upstart ตั้งแต่ 6.10 และ Fedora ตั้งแต่ 9 (จนกว่าพวกเขาจะถูกแทนที่ด้วย systemd) upstart.ubuntu.comและมันเป็นไปได้ที่จะเปลี่ยน Debian ออกจาก sysvinit เป็นเวลาไม่กี่ปี ...
James Tocknell

5

[มัน] ไม่เหมาะสมที่จะแทนที่serviceคำสั่งเก่าด้วยเสื้อคลุมที่เรียกservicectl[sic] แทนหรือไม่?

ใช่ แต่ […] เครื่องมือห่อหุ้มสามารถจัดการได้ทำให้การเปลี่ยนเป็น systemd ราบรื่นขึ้นสำหรับผู้ใช้

…ซึ่งก็คืออย่างที่คนอื่น ๆ พูดไว้ในความคิดเห็นสิ่งที่ทำกันมานานแล้ว

/usr/sbin/serviceคำสั่งใน Debian 8 เป็นส่วนหนึ่งของแพคเกจ sysvinit-utils มันได้รับมีตั้งแต่ปี 2009 มันเป็น Debian เฉพาะ RedHat-เกิดขึ้นนอกจากแพคเกจที่มา sysvinit เดิมและสามารถมองเห็นได้จากการอ่านสคริปต์ก็ตระหนักถึงทั้งการทำงาน systemd และการปรากฏตัวของงานพุ่งพรวดในฟาร์มออกคำสั่งไปsystemctlและinitctl( ผ่านนามแฝง) ตามลำดับ สิ่งนี้ทำมาตั้งแต่ปี 2556

service name actionสามารถใช้งานได้อย่างกว้างขวางแม้ในระบบปฏิบัติการที่ไม่ใช่ Linux มันจะใช้งานได้กับ BSD ส่วนใหญ่เนื่องจากมีserviceคำสั่งของตัวเองเช่นกัน นอกจากนี้ยังมีชิมserviceคำสั่งในแพคเกจ Nosh ที่แปลว่า แต่ ...system-control action name

  • …รับมากกว่าชุดย่อยทั่วไปนี้และมีความเข้ากันได้น้อยลงทั่ว
  • … OpenBSD ไม่มีserviceคำสั่ง
  • ... serviceคำสั่งBSD มีปัญหาที่รู้จักกันดีมายาวนานว่าผู้ดูแลระบบได้บอกเล่าเรื่องราวเกี่ยวกับสงครามมานานหลายทศวรรษ

การเปิดใช้งานและปิดใช้งานบริการเป็นสถานการณ์ที่คล้ายกัน แม้ว่า SuSE chkconfigโปรแกรม (ให้บริการแพคเกจสำหรับ Debian และ Ubuntu) จะแตกต่างกันมากในการที่ Fedora หนึ่ง (พวกเขาถูกเขียนในภาษาโปรแกรมที่แตกต่างกันอย่างสิ้นเชิงแม้ - หนึ่งเรียบเรียงหนึ่งตีความ) มีน้อยที่สุดที่พบบ่อยไวยากรณ์กับการกระทำที่เป็นหรือ. แต่ ...chkconfig name actiononoff

  • …อีกครั้งนอกเหนือจากชุดย่อยทั่วไปนี้มีความเข้ากันได้น้อยลง
  • ... ไม่มีchkconfigใน BSDs ที่เป็นเครื่องมือสำหรับการชุมนุมนี้มีทั้งsysrcหรือ OpenBSD เมื่อเร็ว ๆ นี้และrcctl enable rcctl disableมีchkconfigและrcctlshims ในแพคเกจที่ Nosh แปลและsystem-control enable namesystem-control disable name
  • ... เพียง Fedora chkconfigรู้เกี่ยวกับ systemd และทำหน้าที่เป็น Shim หาและsystemctl enable systemctl disableSuSE chkconfigไม่มีความรู้เกี่ยวกับ systemd

อ่านเพิ่มเติม


2

ไม่มีวิธีมาตรฐานในการเริ่มและหยุดบริการบน Linux

มีบางอย่างที่สามารถช่วยฉันได้จากการเปลี่ยนแปลงในวาระนี้?

ลองใช้เครื่องมือจัดการการกำหนดค่า / ประสาน: เบิ้ล , เชฟ , Saltstack , หุ่นกระบอกหรืออะไรก็ตาม

คุณสามารถเริ่มและเปิดใช้งานบริการด้วย Ansible:

ansible all -i inv -m service -a 'name=service-name state=started enabled=true'

ดูคลาส LinuxServiceในserviceโมดูลของAnsible :

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


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



1

ปัญหาของคุณคือว่า Debian / Ubuntu ได้เปลี่ยนใหม่แทนของเดิมsystemd sysvinitถามว่าอันไหนดีกว่าและคุณจะเริ่มสงครามลุกเป็นไฟ แต่คุณสามารถเปลี่ยนกลับไปเป็นรุ่นเก่าsysvinitได้ตรวจสอบสิ่งนี้หากคุณต้องการกลับไป

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