Score:1

Ubuntu 20.04 â กำลังเรียกใช้สคริปต์เมื่อปิด/รีสตาร์ท

ฉันพยายามเรียกใช้สคริปต์เมื่อปิดเครื่องและรีบูตไม่สำเร็จ ฉันมีสคริปต์ที่จะเรียกใช้ในฐานะรูทเมื่อเริ่มต้นและใช้งานได้ดี: เก็บสคริปต์ไว้ใน /etc/init.d สร้างลิงก์ไปยังสคริปต์ใน /etc/rc2.d โดยเริ่มจาก S99 และทำให้เรียกใช้งานได้ หลังจากการค้นคว้าบางอย่าง ฉันทำเช่นเดียวกันกับสคริปต์การปิดระบบที่สร้างลิงก์ใน /etc/rc0.d และ /etc/rc6.d ทำให้สามารถดำเนินการได้และเริ่มชื่อลิงก์ด้วย âK99myscriptâ แต่สคริปต์ไม่ วิ่ง. ฉันได้ลองเปลี่ยนชื่อลิงก์เป็น âK00myscriptâ เพื่อให้ทำงานก่อนลิงก์อื่น เปลี่ยนจาก sh เป็น bash (#! /bin/sh เป็น #! /bin/bash) แต่ดูเหมือนจะไม่ช่วยอะไร ฉันใช้ Xubunto และใช้ âsystemctl poweroffâ เพื่อปิดและ âsystemctl rebootâ เพื่อรีสตาร์ท นี่เป็นวิธีการที่ล้าสมัยหรือไม่?

ฉันได้พยายามสร้าง .service ใน /etc/systemd/system ตามที่แนะนำ:

[หน่วย]
คำอธิบาย=กระบวนการก่อนปิดเครื่อง
DefaultDependencies=ไม่
ก่อน=shutdown.target reboot.target halt.target kexec.target

[บริการ]
Type=วันช็อต
ผู้ใช้ = ราก
กลุ่ม = ราก
ExecStart=/etc/init.d/myscript

[ติดตั้ง]
WantedBy=shutdown.target รีบูตเป้าหมาย halt.target kexec.target

ทั้งที่มีและไม่มีฟิลด์ User/Group แต่มันใช้งานไม่ได้...

sudodus avatar
jp flag
เหตุใดการเรียกใช้สคริปต์เมื่อปิดระบบจึงมีความสำคัญ จะเพียงพอหรือไม่ที่จะเรียกใช้สคริปต์ทั้งหมดขณะบู๊ต (การบู๊ตแบบเย็นและการรีบูต) ในกรณีนั้น คุณสามารถใช้ `@reboot` ใน `crontab`
FedKad avatar
cn flag
สิ่งนี้ตอบคำถามของคุณหรือไม่ [วิธีรันคำสั่งก่อนปิด Ubuntu 21.04](https://askubuntu.com/questions/1335022/how-to-run-a-command-before-shutdown-on-ubuntu-21-04)
ในระดับผู้ใช้ การทำงานบางอย่างจะเป็นเรื่องง่ายเมื่อปิดเครื่อง รีบูต ออกจากระบบ XFCE มี GUI ที่ดีสำหรับไฟล์ .desktop เท่านั้น แต่ฉันต้องแสดงเป็นรูท วิธีการบริการ systemd ไม่ทำงานแม้จะระบุผู้ใช้และกลุ่มเป็นรูท แต่ฉันพบเงื่อนงำดีๆ ที่นี่: [18.04 - insserv หายไปใน Ubuntu 18 ](https://askubuntu.com/questions/1048330/insserv-missing-on-ubuntu-18) แม้ว่าฉันจะต้องศึกษาเพิ่มเติมอีกเล็กน้อยและเข้าใจว่าควรกำหนดค่าส่วนหัวของ LSB อย่างไร เท่าที่ฉันรู้ว่าเมธอด rc*.d ล้าสมัยไปแล้ว
sudodus avatar
jp flag
เว้นแต่ว่าเรากำลังพูดถึงปัญหาด้านความปลอดภัยหรือความเป็นส่วนตัว ฉันคิดว่ามันน่าจะดีพอที่จะใช้ @reboot ใน crontab คุณเรียกใช้ด้วยการอนุญาตรูทผ่าน `sudo crontab -e` มิฉะนั้น ฉันขอแนะนำวิธีแก้ปัญหา: สร้าง 'การปิดระบบแบบกำหนดเอง' ซึ่งเป็นไฟล์ **เดสก์ท็อป** ที่เรียกใช้งานเชลล์สคริปต์ ที่เรียกใช้งานพิเศษของคุณ จากนั้นจึงทำการปิดระบบ
Score:1

[แก้ไขแล้ว] บางครั้งการเป็นคนดื้อรั้นก็เป็นทางออกที่ดี อย่างไรก็ตาม ขอขอบคุณสำหรับการมีส่วนร่วมของคุณ หลังจากการค้นคว้าตามลิงค์ของความคิดเห็นก่อนหน้าของฉัน (คำตอบของ 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 ที่อธิบายไว้ข้างต้นอาจมีประโยชน์สำหรับสคริปต์/คำสั่งเริ่มต้นในอีกไม่ช้า

sudodus avatar
jp flag
ขอบคุณที่แบ่งปันวิธีแก้ปัญหานี้ :-)

โพสต์คำตอบ

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