สคริปต์ init.d ที่เขียนด้วย Python


10

มีคำถามเกิดขึ้นใน StackOverflow ซึ่งถามเกี่ยวกับการเขียนinit.dสคริปต์ใน Python หนึ่งความคิดเห็นระบุว่าสคริปต์เหล่านี้ควรตั้งโปรแกรมในเชลล์ไม่ใช่ Python กำลังเขียนinit.dสคริปต์ใน Python:

  1. ไม่ดี ไม่ดี ไม่ดี อย่าทำอย่างนี้
  2. ไม่ใช่วิธีปฏิบัติที่แนะนำ
  3. ตกลงกับคำเตือน
  4. มรดกความเชื่อ
  5. ดีโดยสิ้นเชิง

มันจะเป็นการดีหากรู้สถานการณ์ฝันร้ายใด ๆ หรือถ้ากฎนี้เขียนด้วยเลือดของระบบ

คำตอบ:


9

ฉันจะบอกว่า # 2 แต่ใกล้กับ # 1 - "แย่แย่แย่เลยอย่าทำอย่างนี้เลย" มาตรฐานเช่นนี้สำหรับสคริปต์เริ่มต้นของ Linux อยู่ใน LSBและในขณะที่มันไม่เคยออกมาและกล่าวว่า "นี่คือสคริปต์เชลล์ bourne" มีการสันนิษฐานหลายประการ หนึ่งบรรทัดที่เริ่มต้นด้วย # คือความคิดเห็นเกิดขึ้นเมื่อทำงานได้ดี ปัญหาที่มากขึ้นคือข้อกำหนดที่สคริปต์ init เรียกใช้คำสั่งจาก/lib/lsb/init-functions"ในสภาพแวดล้อมปัจจุบัน (ดูจุดคำสั่งในตัวเชลล์พิเศษ)"

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

สิ่งที่ควรคำนึงถึงก็คือการsystemdเริ่มต้นระบบในอนาคตของทุกระบบบน Linux ภายใต้ systemd การกำหนดค่าเริ่มต้นทำได้โดยไฟล์การกำหนดค่าแบบง่าย ๆ แทนที่จะเป็นสคริปต์แนวคิดที่ว่าการเริ่มต้นทั้งหมดนั้นเหมาะสมกับรูปแบบการออกแบบมาตรฐานหลายรูปแบบและคุณควรเลือกอย่างใดอย่างหนึ่ง หากโปรแกรมของคุณใช้บางสิ่งที่ซับซ้อนสำหรับการเริ่มต้นโปรแกรมนั้นควรอยู่นอกสคริปต์เริ่มต้นเอง


1
ฉันจะไปกับคำตอบนี้ ประเด็นก็คือ Python ไม่จำเป็นและไม่ได้เป็นมาตรฐานดังนั้นจึงสามารถสร้างจุดพิเศษในการแก้ไขข้อบกพร่องความไม่แน่นอนและจุดความล้มเหลวเพิ่มเติม ตามคำถาม SO ดั้งเดิมฉันรวบรวมว่าสคริปต์ดังกล่าวสามารถเปิดใช้ daemons ได้ แต่ไม่ควรเป็น daemons จริง
mjhm

ถ้าฉันจำได้ไม่ distros ทั้งหมดตาม LSB เห็นเดเบียน
Massimo

10

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

อย่างไรก็ตาม ... ซึ่งหมายความว่าล่าม Python รุ่นใดรุ่นหนึ่งอาจมีความสำคัญสำหรับลำดับการบู๊ตของคุณและนี่เป็นอีกหนึ่งสิ่งที่คุณต้องตรวจสอบในการอัพเกรด

ฉันเดาว่านี่หมายความว่าฉันกำลังพูดว่า "3. ตกลงด้วยคำพูด"


4
+1 สิ่งที่ฉันกำลังเขียน "ปัญหา" เพียงอย่างเดียวที่นี่จะทำให้แน่ใจว่าคุณปฏิบัติตาม LSB (เช่นการจัดหาฟังก์ชั่นที่จำเป็น) และตรวจสอบให้แน่ใจว่าคุณต้องการล่ามไพ ธ อนที่รันไทม์ (และไม่เสีย)
Sam Halicke

3
พร้อมใช้งานที่รันไทม์อาจมีความซับซ้อนหากผู้ใช้เลือกที่จะมี / usr บนพาร์ติชันแยกต่างหาก มันเป็นสิ่งสำคัญที่สคริปต์ของคุณจะรันหลังจาก / usr ถูกเมาท์เนื่องจาก python นั้นถูกติดตั้งใน / usr
Zoredache

@Zoredache - Ayup โดยทั่วไปแล้วคุณจะรู้ว่า "เกิดขึ้น" เมื่อคุณมาช้าในลำดับ RC "ผู้ใช้หลายคน"
Vatine

2

ฉันเห็นด้วยกับ "3. ตกลงกับคำเตือน" แต่ด้วยเหตุผลอื่น ประสบการณ์ของฉันเกี่ยวกับ Solaris คือพวกเขามีสำเนาของ Perl สำหรับโปรแกรมภายในบางโปรแกรม เชลล์สคริปต์ไม่มีอะไรมากไปกว่าเชลล์ที่จะให้ Perl เริ่มใช้งาน สคริปต์เริ่มต้นต้องถูกเขียนเป็นดวลจุดโทษหรือไม่? ไม่ แต่มันปรับปรุงความสามารถในการบำรุงรักษาสำหรับผู้ดูแลระบบ และสคริปต์ init ไม่ได้ทำอะไรที่ซับซ้อนมากขึ้นสิ่งที่ชอบหรือdaemon --start daemon --stopหากคุณทำสิ่งนี้ผู้ใช้ทั่วไปสามารถเริ่มต้นเครื่องมือของคุณในโหมดที่ไม่มีสิทธิใช้งานได้หากนั่นเหมาะสมในบริบทของโปรแกรมของคุณ และพวกเขาไม่จำเป็นต้องมีการตั้งค่าที่ซับซ้อนทุกประเภทเพื่อกลเม็ดเด็ดพราย

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

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


1

ฉันพูดระหว่าง # 1-2 LSB นำคุณในลักษณะนี้ .. และจาก Sys-Admin (ไม่ใช่บทบาท dev) ความรู้เรื่อง sh / bash สั่งงานของ req, ไม่ใช่ dev-level (หรือแม้แต่ความเข้าใจเบา ๆ ) ของ python, PHP หรือ perl ใช้สำหรับสแต็ก LAMP ไม่ใช่สำหรับสคริปต์เริ่มต้นระบบ

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