[แก้ไขแล้ว]
บางครั้งการเป็นคนดื้อรั้นก็เป็นทางออกที่ดี อย่างไรก็ตาม ขอขอบคุณสำหรับการมีส่วนร่วมของคุณ
หลังจากการค้นคว้าตามลิงค์ของความคิดเห็นก่อนหน้าของฉัน (คำตอบของ Sebastian Stark) ฉันลงเอยด้วยสคริปต์นี้ (ขอเรียกมันว่า âmyoffscriptâ) ในโฟลเดอร์ /etc/init.d ของฉัน:
#!/bin/sh
### เริ่มข้อมูลเริ่มต้น
# เริ่มต้นที่จำเป็น: $local_fs
# จำเป็นต้องหยุด: $local_fs
# ให้: ปิดหรือรีบูต Exec
# เริ่มต้นเริ่มต้น: 4
# Default-Stop: 0 6
# คำอธิบาย: ปิดเครื่องหรือรีบูต
### สิ้นสุด INIT INFO
กรณี "$1" ใน
หยุด)
echo $(date) >> /ZZZdate # REPLACE PREVIOUS EXAMPLE: ดำเนินการคำสั่ง SHUTDOWN/REBOOT ที่นี่
;;
เอสแซค
ทางออก 0
เกี่ยวกับสคริปต์ข้างต้น สิ่งสำคัญที่สุดที่ต้องเน้นคือ:
1 - ส่วนหัว LSB (Linux Standard Base) â âDefault-Startâ และ âDefault-Stopâ ระดับการทำงานต้องมีทั้งคู่ ซึ่งสอดคล้องกัน â0â เพื่อปิด (rc0.d) และ â6â เพื่อรีบูต (rc6.d). เนื่องจากสคริปต์ของฉันใช้สำหรับปิดและรีบูตเท่านั้น และต้องระบุ âDefault-Startâ ฉันจึงเลือก â4â (rc4.d) แม่มดไม่ได้ใช้/ผู้ใช้กำหนดได้ แต่ควรรันระดับ â2â (rc2.d) หากจำเป็นต้องเริ่มบางอย่างในเวลาบูต (เช่น บริการ, daemon,â¦)
2 - คำสั่งกรณี - เนื่องจากสคริปต์ดำเนินการโดย ระบบ เป็น บริการ ด้วยอาร์กิวเมนต์ âstartâ หรือ âstopâ ตาม âDefault-Startâ และ âDefault-Stopâ จากส่วนหัว LSB คำสั่งทั้งหมดจะต้องอยู่ภายในกรณี คำแถลง. (คำสั่งก่อนคำสั่ง case ถูกละเว้นในการทดสอบของฉัน) ตามระดับการทำงาน â0â และ â6â คำสั่งกรณีของฉันมีเพียง หยุด) ตัวเลือก แต่ถ้าจำเป็นต้องทำงานในเวลาบูต a เริ่ม) ควรรวมตัวเลือก (และต้องระบุระดับการเรียกใช้ â2â ในส่วนหัว LSB âDefault-Startâ)
ตอนนี้มาทำให้มันใช้งานได้
ก่อนอื่นให้สร้างสคริปต์ /etc/init.d/myoffscript ที่เรียกใช้งานได้
จากนั้น เรามีสองทางเลือก - กับ สั่งการ หรือ ด้วยตนเอง.
ด้วยคำสั่ง:
# systemctl เปิดใช้งาน myoffscript
หรือ
# /lib/systemd/systemd-sysv-install เปิดใช้งาน myoffscript
ลิงก์สัญลักษณ์ที่เกี่ยวข้องจะถูกสร้างขึ้นโดยอัตโนมัติในโฟลเดอร์ rc*.d ที่เกี่ยวข้อง (S01myoffscript ใน rc4.d และ K01myoffscript ใน rc0.d และ rc6.d ตามสคริปต์ด้านบน)
คำสั่งจะใช้ได้ก็ต่อเมื่อไม่มีการสร้างลิงค์มาก่อน มิฉะนั้นข้อผิดพลาดจะถูกรายงาน
ด้วยตนเอง:
จากแต่ละโฟลเดอร์ rc*.d ให้สร้างลิงก์สัญลักษณ์
# ซีดี /etc/rc4.d
# ln -s ../init.d/myoffscript S01myoffscript
# ซีดี /etc/rc0.d
# ln -s ../init.d/myoffscript K01myoffscript
# ซีดี /etc/rc6.d
# ln -s ../init.d/myoffscript K01myoffscript
หมายเหตุ: หากระบุระดับการทำงาน â2â ใน âDefault-Startâ ลิงก์แรกควรสร้างใน /etc/rc2.d ต่อไปเรื่อยๆ...
รีสตาร์ทระบบและทุกอย่างจะทำงานได้
นี่เป็นวิธีเดียวที่ฉันพบในการเรียกใช้สคริปต์ในฐานะรูททั้งที่ปิดเครื่องและรีบูตด้วย Ubuntu 20.04
หมายเหตุ: แม้จะมี /etc/int.d และ /etc/rc2.d วิธีลิงก์ยังคงทำงานเพื่อเรียกใช้สคริปต์/คำสั่งในขณะบู๊ต ดังที่กล่าวไว้ในลิงก์ความคิดเห็นก่อนหน้าของฉัน แนวทางระยะยาวคือการแปลงสคริปต์เริ่มต้นเป็นหน่วยบริการ systemdดังนั้น ส่วนหัว LBS ที่มีเมธอด case statement ที่อธิบายไว้ข้างต้นอาจมีประโยชน์สำหรับสคริปต์/คำสั่งเริ่มต้นในอีกไม่ช้า