บริการใน Debian ทำงานอย่างไรและฉันจะจัดการได้อย่างไร


79

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

ฉันจะทำสิ่งเดียวกันใน Linux ได้อย่างไร ฉันจะทริกเกอร์ให้เรียกใช้ "svnserve" เมื่อเริ่มต้นได้อย่างไรหรือฉันจะกำหนดค่าบริการให้ทำงานในบริบทพิเศษได้อย่างไร ฉันจะดูบริการ "ที่ตั้งโปรแกรม" ทั้งหมดได้อย่างไร


9
คุณใช้การกระจายและรุ่นใด การจัดการบริการ (บริการมักเรียกว่า 'daemons' ในโลก Unix) เคยเป็นเรื่องง่ายและกึ่งมาตรฐาน ทุกวันนี้หลายสิ่งหลายอย่างเปลี่ยนไปมากขึ้น และไม่ดีเสมอไป :) นอกจากนี้คุณหมายถึงอะไรตามบริบท ?
Alexios

แม้ว่าจะดูเหมือนว่า systemd จะชนะสงครามระบบสงครามอย่างช้าๆ Debian เป็นโฮลด์เอ้าท์ใหญ่ล่าสุดที่ยังคงใช้ SysVinit เก่าและขณะนี้อยู่ในขั้นตอนการพิจารณาว่าระบบ init ใดที่จะไปด้วย
Patrick

1
ขณะนี้ฉันทำงานกับ Debian (เสถียรล่าสุด) และตามบริบทฉันหมายถึงตัวแปรพา ธ หรือบริบทผู้ใช้ที่ระบุ
Erdinc Ay

1
หากคุณต้องการใช้serverคำสั่งที่ Debian เท่านั้นดูunix.stackexchange.com/q/226089/130402
Peter Krauss

คำตอบ:


124

ปัจจุบันมี 3 ระบบเริ่มต้นหลักที่ใช้โดย linux ไม่กี่ปีที่ผ่านมามีเพียงหนึ่ง SysVinit แต่ SysVinit ยังขาดความสามารถอย่างจริงจังเช่นกราฟการพึ่งพาบริการดังนั้นตอนนี้จึงถูกคัดค้านใน distros ส่วนใหญ่ ปัจจุบัน distros ส่วนใหญ่จะเปลี่ยนไปใช้systemd แม้ว่าจะมียังพุ่งพรวด

แต่นี่คือคำตอบสำหรับคำถามของคุณสำหรับระบบเริ่มต้น 3 ระบบ:

 

sysvinit

SysVinit ปัจจุบันใช้โดย Debian และ RedHat แม้ว่า RedHat รุ่นต่อไป (7) จะใช้ systemd

วิธีการเปิดใช้งานบริการ SysVinit แบบไม่ต่อเนื่องในการบู๊ตคือการเชื่อมโยงเข้าด้วยกันใน/etc/rc3.d(หรือ/etc/rc2.d) /etc/init.dบริการทั้งหมดสามารถพบได้ใน อย่างไรก็ตามโปรดทราบว่า distros มักจะมีเครื่องมือของตนเองสำหรับจัดการไฟล์เหล่านี้และควรใช้เครื่องมือนั้นแทน (Fedora / RedHat มีserviceและchkconfig, ubuntu มีupdate-rc.d)

บริการรายการ:

ls /etc/init.d/

เริ่มบริการ:

/etc/init.d/{SERVICENAME} start

หรือ

service {SERVICENAME} start

หยุดบริการ:

/etc/init.d/{SERVICENAME} stop

หรือ

service {SERVICENAME} stop

เปิดใช้งานบริการ:

cd /etc/rc3.d
ln -s ../init.d/{SERVICENAME} S95{SERVICENAME}

( S95ใช้เพื่อระบุคำสั่งซื้อ S01 จะเริ่มก่อน S02 เป็นต้น)

ปิดการใช้งานบริการ:

rm /etc/rc3.d/*{SERVICENAME}

 

Systemd

การกระจายที่โดดเด่นที่สุดโดยใช้ systemd คือ Fedora แม้ว่ามันจะถูกใช้โดยคนอื่น ๆ อีกมากมาย นอกจากนี้เมื่อ Debian เลือกที่จะใช้ systemd overstart มันจะกลายเป็นระบบ defacto upstart สำหรับการแจกแจงส่วนใหญ่ (Ubuntu ได้ประกาศไปแล้วว่าพวกเขาจะปล่อย upstart สำหรับ systemd)

บริการรายการ:

systemctl list-unit-files

เริ่มบริการ:

systemctl start {SERVICENAME}

หยุดบริการ:

systemctl stop {SERVICENAME}

เปิดใช้งานบริการ:

systemctl enable {SERVICENAME}

ปิดการใช้งานบริการ:

systemctl disable {SERVICENAME}

 

พุ่งพรวด

พุ่งพรวดได้รับการพัฒนาโดยคนอูบุนตู แต่หลังจากที่เดเบียนตัดสินใจจะไปกับ systemd , อูบุนตูประกาศว่าพวกเขาจะลดลงพุ่งพรวด

คนธรรมดาก็ใช้ RedHat สั้น ๆ ในขณะที่มันอยู่ใน RHEL-6 แต่มันก็ไม่ได้ใช้กันทั่วไป

บริการรายการ:

initctl list

เริ่มบริการ:

initctl start {SERVICENAME}

หยุดบริการ:

initctl stop {SERVICENAME}

เปิดใช้งานบริการ:

2 วิธีน่าเสียดาย:

  1. จะมีไฟล์ที่มีบรรทัด/etc/default/{SERVICENAME} เปลี่ยนบรรทัดนี้ENABLED=...ENABLED=1

  2. /etc/init/{SERVICENAME}.overrideจะมีไฟล์ ตรวจสอบให้แน่ใจว่ามันมีstart(หรือขาดทั้งหมด) manualไม่ได้

ปิดการใช้งานบริการ:

echo manual > /etc/init/{SERVICENAME}.override

หมายเหตุ: นอกจากนี้ยังมีระบบเริ่มต้น 'OpenRC' ซึ่งใช้โดย Gentoo ปัจจุบัน Gentoo เป็น distro เดียวที่ใช้งานและไม่ได้รับการพิจารณาสำหรับการใช้งานหรือสนับสนุนโดย distro อื่น ๆ ดังนั้นฉันจึงไม่ครอบคลุมถึงการใช้งาน (แม้ว่าความคิดเห็นจะเป็นอย่างไรฉันสามารถเพิ่มได้)


OpenRC เป็นสิ่งที่เป็นนามธรรมสำหรับ SysVinit มันไม่ได้แทนที่มันเพิ่มเข้าไป
Spidey

เขียนดีมาก! เพียงแค่การแก้ไขเล็กน้อยสองสามประการ: RHEL 6.x (และ CentOS 6.x และอนุพันธ์อื่น ๆ ) ใช้การเริ่มต้นเช่น Ubuntu (แม้ว่าบริการส่วนใหญ่ยังคงใช้สคริปต์ SysV อยู่ดี) นอกจากนี้ฉันจะเพิ่มว่า "chkconfig" (RH) และ "update-rc.d" (Debian) เป็นวิธี "ทางการ" ในการเพิ่มลิงก์ไปยังไดเรกทอรี rc? .d
rsuarez

@rarearez จุดที่ดีในสิ่ง RHEL6 แม้ว่าดูเหมือนจะไม่ได้ใช้งานมากนัก ระบบส่วนใหญ่ยังคงทำงานผ่าน SysVinit ดั้งเดิม (17 พุ่งพรวด, 89 SysVinit บนหนึ่งในระบบ RHEL6 ของฉัน) และchkconfigและได้update-rc.dมีการกล่าวถึง ดูย่อหน้าที่สองภายใต้SysVinit :-)
Patrick

@Patrick เห็นด้วยกับ # 1; "โอ๊ะ!" ใน # 2 :-)
rsuarez

1
ขอบคุณสำหรับคำตอบที่ครอบคลุมตอนนี้ฉันมีภาพใหญ่ ขณะนี้ฉันกำลังใช้Debian (เสถียรล่าสุด) ที่นี่ในยุโรปที่พูดภาษาเยอรมันมีคำแนะนำที่ดีที่สุด แต่บางทีฉันอาจลอง Redhat
Erdinc Ay

9

การกระจายที่ต่างกันใช้กลไกที่แตกต่างกันในการจัดการบริการ ซอฟต์แวร์เพื่อจัดการบริการเรียกว่าinitหลังจากชื่อดั้งเดิมสำหรับกระบวนการแรก (ด้วย ID กระบวนการ 1) ซึ่งรับผิดชอบการเริ่มต้นบริการอื่น ๆ

Debian ใช้ตัวแปรSysVinitดั้งเดิมของ init ภายใต้ระบบนี้จะมีชุดของสคริปต์ในไดเรกทอรี/etc/init( ตำแหน่งนี้และตำแหน่งอื่นอาจแตกต่างกันเล็กน้อยระหว่างการแจกแจงที่ใช้ SysVinit) สคริปต์เหล่านี้จะไม่เรียกโดยตรง /etc/rc?.dแต่ผ่านการเชื่อมโยงสัญลักษณ์ในไดเรกทอรี มันคือการแสดงตนและชื่อของลิงค์สัญลักษณ์เหล่านี้ที่กำหนดว่าจะให้บริการเริ่มเมื่อใด สำหรับรายละเอียดเพิ่มเติมอ่านบทที่เกี่ยวกับ init ใน Debian อ้างอิง

ลอง/etc/rc?.dดูว่าบริการใดบ้างที่มีอยู่แล้ว ตัวอักษรหรือตัวเลขก่อนจุดคือ runlevel รายการที่ชื่อขึ้นต้นด้วยSจะถูกดำเนินการด้วยอาร์กิวเมนต์startเมื่อเข้าสู่ runlevel และรายการที่มีชื่อขึ้นต้นด้วยKจะถูกดำเนินการเมื่อออกจาก runlevel ลำดับระดับการทำงานปกติ: S ในระหว่างการบูต (เพื่อ/etc/rcS.d/S*จะดำเนินการ) แล้ว 2 (เพื่อ/etc/rc2.d/S*จะดำเนินการ) เมื่อถึงเวลาปิดระบบ/etc/rc2.d/K*จะถูกดำเนินการจากนั้น runlevel จะเปลี่ยนเป็น 0 (หรือ 6 สำหรับการรีบูต)

สรุปถ้าคุณต้องการสร้างสคริปต์เริ่มต้นสำหรับบริการใหม่:

  • /etc/init.dเขียนสคริปต์เชลล์ใน สคริปต์นี้ต้องยอมรับอาร์กิวเมนต์หนึ่งซึ่งอาจจะเป็นstart, stop, force-reload, restartหรือ (ถ้ามี) หรือreload statusความแตกต่างระหว่างreloadและrestartที่restartเทียบเท่ากับstopตามstartในขณะที่reloadโหลดการตั้งค่าโดยไม่หยุดอะไร (ถ้าบริการรองรับ) force-reloadไม่reloadถ้ามีและrestartเป็นอย่างอื่น ดูไฟล์ที่มีอยู่และทำให้สคริปต์ทำงานในเวลาบูตด้วย Debianสำหรับตัวอย่าง
  • เรียกใช้update-rc.dเพื่อสร้างลิงก์สัญลักษณ์เพื่อเริ่มและหยุดบริการของคุณ บริการส่วนใหญ่ทำงานใน runlevels 2, 3, 4 และ 5

โปรดทราบว่าเพื่อให้เข้าถึง svn ได้ง่ายขึ้นในการตั้งค่า Apache และใช้โปรโตคอล HTTP หรือ HTTPS สิ่งนี้มีประโยชน์ด้านการอนุญาตให้เรียกดูที่เก็บข้อมูลอย่างรวดเร็วผ่านเว็บเบราว์เซอร์


2

จากพื้นฐาน unix แบบดั้งเดิมไม่มีอะไรพิเศษเกี่ยวกับบริการ บริการเป็นเพียงกระบวนการ แต่มีข้อยกเว้นสองประการ: พวกเขาไม่จำเป็นต้องมีเทอร์มินัลและพวกเขาเริ่มต้นเมื่อบูต วิธีที่พวกเขาเริ่มต้นตอนบูทขึ้นอยู่กับ init (ซึ่งอาจเป็น sysv init, bsd init, upstart, systemd หรืออย่างอื่นตรวจสอบหน้า man ของคุณสำหรับ init) และดูว่าคุณกำลังใช้ wrapper สำหรับงานหรือการกำหนดค่า init ไม่มีอะไรหยุดคุณจากการเรียกใช้บริการจากเทอร์มินัลอันที่จริงมันเป็นเรื่องธรรมดาสำหรับวัตถุประสงค์ในการทดสอบ

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