การเรียกใช้สคริปต์ระหว่างการบูท / เริ่มต้น; init.d vs cron @reboot


48

ฉันกำลังพยายามที่จะเข้าใจความแตกต่างระหว่างinit.dและ cron @rebootสำหรับการเรียกใช้สคริปต์เมื่อเริ่มต้น / บูตระบบ

การใช้@reboot(วิธีนี้ถูกกล่าวถึงในฟอรัมนี้โดยhs.chandra ) เป็นสิ่งที่ง่ายกว่าเพียงเข้าไปในcrontab -eการสร้าง@reboot /some_directory/to_your/script/your_script.txtและจากนั้นyour_script.txtจะถูกเรียกใช้งานทุกครั้งที่มีการรีบูตระบบ ในเชิงลึกของคำอธิบาย@rebootคือที่นี่

อีกทางเลือกหนึ่งโดยฝัง/etc/init.d/your_script.txtลงในบรรทัดที่สองของสคริปต์ของคุณเช่น:

#!/bin/bash
# /etc/init.d/your_script.txt

คุณสามารถเรียกใช้chmod +x /etc/init.d/your_script.txtและควรส่งผลyour_script.txtให้รันทุกครั้งที่ระบบบูต

Q1:ความแตกต่างที่สำคัญระหว่างสองคืออะไร
Q2: ข้อไหนแข็งแกร่งกว่ากัน
Q3:มีหนึ่งในสองที่ดีกว่านี้หรือไม่?
Q4:นี่เป็นวิธีที่ถูกต้องในการฝังสคริปต์เพื่อให้ทำงานในระหว่างการบูทหรือไม่?

ฉันจะรวมไฟล์ bash .sh ไว้เพื่อทำงานในระหว่างการเริ่มต้น


2
ที่เกี่ยวข้องอีกอย่างคือ systemd, link1 link2
Rufus

คำตอบ:


37

init.dหรือที่เรียกว่าสคริปต์ SysV มีวัตถุประสงค์เพื่อเริ่มและหยุดบริการระหว่างการเริ่มต้นระบบและการปิดระบบ ( /etc/init.d/สคริปต์ยังทำงานบนระบบที่เปิดใช้งาน systemd เพื่อความเข้ากันได้)

  • สคริปต์ถูกเรียกใช้งานระหว่างการบู๊ตและปิดเครื่อง (ตามค่าเริ่มต้น)
  • สคริปต์ควรเป็นสคริปต์ init.d ไม่ใช่เพียงสคริปต์ ควรสนับสนุนstartและstopอีกมากมาย (ดูนโยบาย Debian )
  • สคริปต์สามารถดำเนินการในระหว่างการบูตระบบ (คุณสามารถกำหนดเมื่อ)

crontab(และดังนั้น@reboot)

  • cron จะรันคำสั่งหรือสคริปต์ปกติไม่มีอะไรพิเศษที่นี่
  • ผู้ใช้ใด ๆ สามารถเพิ่ม@rebootสคริปต์ (ไม่ใช่แค่รูท)
  • บนระบบ Debian กับ systemd: @reboot cron multi-user.targetจะดำเนินการในช่วง
  • บนระบบ Debian ที่มี SysV (ไม่ใช่ systemd), crontab (5) พูดถึง: โปรดทราบว่าการเริ่มต้นตามที่ @reboot เกี่ยวข้องนั้นเป็นเวลาที่ cron (8) daemon เริ่มทำงาน โดยเฉพาะอย่างยิ่งอาจเป็นก่อนที่ daemons ของระบบหรือระบบอำนวยความสะดวกอื่น ๆ นี่เป็นเพราะลำดับการบู๊ตของเครื่อง
  • มันง่ายที่จะกำหนดตารางสคริปต์เดียวกันตอนบู๊ตและเป็นระยะ

/etc/rc.localมักจะคิดว่าน่าเกลียดหรือเลิกใช้แล้ว (อย่างน้อยก็redhat ) แต่ก็ยังมีคุณสมบัติที่ดีอยู่บ้าง:

  • rc.local จะรันคำสั่งหรือสคริปต์ปกติไม่มีอะไรพิเศษที่นี่
  • บนระบบ Debian ด้วย SysV (ไม่ใช่ systemd): rc.localคือ (เกือบ) บริการสุดท้ายที่เริ่มต้น
  • แต่ในระบบ Debian ที่มี systemd: rc.localจะถูกดำเนินการnetwork.targetตามค่าเริ่มต้น (ไม่ใช่network-online.target!)

เกี่ยวกับ systemd ของnetwork.targetและnetwork-online.target, อ่านเรียกใช้บริการหลังจากที่เครือข่ายขึ้น


ใน Ununtu 16.04 ของฉันฉันต้องลบ/var/run/crond.rebootไฟล์ทุกครั้งถ้าฉันต้องการทำงาน @reboot cron มากกว่าทุกครั้งที่ระบบเริ่มทำงาน หากไฟล์นี้มีอยู่ @reboot cron งานจะไม่ถูกดำเนินการ
Albert Català

@ Albert-Catala ส่งข้อผิดพลาดไปยัง Ubuntu!
Franklin Piat

12

ประการแรกการชี้แจงอยู่ในลำดับ:

  • init.dเป็นไดเรกทอรีที่เก็บสคริปต์ควบคุมบริการซึ่งควบคุมการเริ่มต้นและหยุดบริการเช่นhttpdหรือcron
  • rc.localเป็นบริการที่ช่วยให้การเรียกใช้สคริปต์โดยพลการเป็นส่วนหนึ่งของกระบวนการเริ่มต้นระบบ

ในแง่ของการใช้rc.localหรือcronเรียกใช้สคริปต์ของคุณดีกว่าฉันคิดว่ามันเป็นคำถามเกี่ยวกับสุนทรียภาพมากกว่าการใช้งานจริง cronในฐานะที่เป็นตัวกำหนดเวลางานมีไว้สำหรับวิธีการบำรุงรักษาหรือบำรุงรักษาเครื่องเช่นการตรวจสอบการอัพเดตการทำความสะอาดแคชหรือการตรวจสอบความปลอดภัย นี่ไม่ได้หมายความว่ามัน จำกัด การใช้งานฟังก์ชั่นเหล่านั้นเนื่องจากสามารถเรียกใช้สคริปต์หรือคำสั่งที่ต้องการในเวลาที่กำหนด (เช่น@reboot)

ใช้rc.localบนมืออื่น ๆ ที่จะตกมากขึ้นภายในประเภทการกำหนดค่าระบบของงานเช่นrc.localการดำเนินการโดยเครื่องระบบ init, โดยทั่วไปจะมีความรับผิดชอบสำหรับการตั้งค่าการกำหนดค่าเครื่องเครือข่ายบริการหรือสภาพแวดล้อม (อีกครั้ง แต่ไม่ จำกัด เพียง งานนี้)

อย่างไรก็ตามประเด็นเหล่านี้ควรมีความจริงที่ว่าไม่ใช่ระบบ init ทั้งหมดที่เสนอrc.localกลไกและ cron daemons ไม่ทั้งหมดเสนอ@rebootแท็ก psuedo

คะแนนโบนัส

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

คำสุดท้าย

ควรสังเกตว่าโดยทั่วไปแล้วสคริปต์ทุบตีจะลงท้ายด้วยคำต่อท้าย.shแทนที่จะ.txtเป็นทันทีซึ่งแสดงว่าไฟล์นั้นเป็นสคริปต์เชลล์แทนที่จะเป็นไฟล์ข้อความ ที่กล่าวว่าหากมีทั้งshebang ( #!/bin/bash) ที่ด้านบนของไฟล์หรือเรียกว่าเป็นbash /path/to/script.whateverมันไม่ควรมีความสำคัญในการดำเนินการสคริปต์


bashโดยทั่วไปแล้วสคริปต์ไม่(และไม่ควรระบุ)ลงท้ายด้วยshส่วนขยาย
mikeserv

1
@mikeserv: ในขณะที่ฉันยอมรับว่าสคริปต์ทุบตีส่วนใหญ่ไม่มี (และเนื้อหาไม่ควร) มีส่วนขยายใด ๆ โดยปกติไฟล์ที่มีนามสกุล ".sh" เป็นสคริปต์ทุบตี - ดู"ไฟล์. sh คืออะไร" .
David Cary

@DavidCary - ดูเหมือนจะไม่เป็นแหล่งข้อมูลที่เชื่อถือได้มาก
mikeserv

1
Wikipedia: "รายการส่วนขยายชื่อไฟล์"และWikipedia: "shell script"ยังกล่าวถึงส่วนขยาย ".sh" ที่พบได้ทั่วไปอย่างน่าประหลาดใจพร้อมการอ้างอิง
เดวิดแครี

1
" โดยทั่วไปแล้วสคริปต์ทุบตีจะลงท้ายด้วยคำต่อท้าย.shแทนที่จะเป็น.txt " - ความหมายเฉพาะshนั้นมีความแม่นยำมากกว่าในฐานะส่วนขยายชื่อไฟล์สำหรับสคริปต์ทุบตี (หรือเชลล์สคริปต์อื่น ๆ ) txtซึ่งโดยทั่วไปจะแสดงข้อความธรรมดา คุณสามารถใช้ส่วนขยายใดก็ได้ที่ทำให้คุณหัวเราะคิกคัก แต่การประชุมทั่วไปจะเป็นไปได้หากใช้ส่วนขยายshจะเหมาะสมกว่าและใช้กันทั่วไป PATHถึงแม้ว่ามันจะไม่จำเป็นต้องใช้โดยเฉพาะอย่างยิ่งสำหรับสคริปต์ที่มีความตั้งใจที่จะดำเนินการจาก
ห่อ

3

ฉันกำลังเขียนคำตอบของฉันด้านล่าง;

Q1: ความแตกต่างที่สำคัญระหว่างทั้งสองคืออะไร

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

Q2: ข้อไหนแข็งแกร่งกว่ากัน

จากข้างต้นฉันคิดว่า init นั้นแข็งแกร่งกว่า แต่มีจุดอื่นตามที่กล่าวไว้โดย "Franklin Piat" ในคำตอบแรก โดยปกติคุณต้องเริ่มต้นสคริปต์สำหรับ daemon และคุณควรปฏิบัติตามนโยบาย

Q3: มีหนึ่งในสองที่ดีกว่านี้หรือไม่?

ฉันไม่คิดอย่างนั้น (rc.local ค่อนข้างเก่าและเลิกใช้แล้ว)

Q4: นี่เป็นวิธีที่ถูกต้องในการฝังสคริปต์เพื่อให้ทำงานในระหว่างการบูทหรือไม่?

ใช่. โดยปกติแล้วตัวเขียนแอปพลิเคชัน / แพ็คเกจจะทำด้วยวิธีนี้

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