Score:-1

ป้องกันไม่ให้ apt-get ขอการยืนยันเมื่อเรียกใช้จาก cron ได้อย่างน่าเชื่อถือ

ธง cn

บนเซิร์ฟเวอร์ Ubuntu 20.04LTS ของฉัน ฉันมีงาน cron สำหรับการลบเคอร์เนลเวอร์ชันเก่าเพื่อป้องกันไม่ให้พาร์ติชัน /boot มีพื้นที่ว่างไม่เพียงพอ มันทำงานโดยการสอบถามกับ dpkg-แบบสอบถาม สำหรับรายการที่ติดตั้ง ลินุกซ์อิมเมจ บรรจุหีบห่อแล้วให้อาหารทั้งหมดยกเว้นสามคนสุดท้าย apt-get ล้าง -y. ใช้งานได้ดีเกือบตลอดเวลา

ด้วยเหตุผลต่างๆ กัน กระบวนการนี้จะเลือกเคอร์เนลที่กำลังทำงานอยู่เพื่อนำออกด้วยเหตุผลหลายประการ สิ่งนี้ไม่น่าจะเป็นปัญหา เนื่องจากตาม manpage ของมัน ฉลาดรับ กับ เดอะ -ย ตัวเลือกควรยกเลิกในกรณีนี้ อย่างไรก็ตามในความเป็นจริงสิ่งนี้ทำให้งาน cron หยุดทำงานอย่างไม่มีกำหนด เอาต์พุตมาตรฐานจากงาน ซึ่งบันทึกเป็นไฟล์ แสดง:

การลบ linux-image-5.4.0-100-generic (5.4.0-100.113) ...
debconf: ไม่สามารถเริ่มต้นส่วนหน้า: กล่องโต้ตอบ
debconf: (ไม่ได้ตั้งค่า TERM ดังนั้นส่วนหน้าของไดอะล็อกจึงไม่สามารถใช้งานได้)
debconf: ถอยกลับไปส่วนหน้า: Readline
การลบ linux-image-5.4.0-100-generic
--------------------------------------

คุณกำลังเรียกใช้เคอร์เนล (รุ่น 5.4.0-100-generic) และพยายามที่จะลบ
รุ่นเดียวกัน

ซึ่งจะทำให้ระบบไม่สามารถบูตได้เนื่องจากระบบจะลบออก
/boot/vmlinuz-5.4.0-100-generic และโมดูลทั้งหมดภายใต้ไดเร็กทอรี
/lib/modules/5.4.0-100-generic สิ่งนี้สามารถแก้ไขได้ด้วยสำเนาของเคอร์เนลเท่านั้น
รูปภาพและโมดูลที่เกี่ยวข้อง

ขอแนะนำให้ยกเลิกการลบเคอร์เนล เว้นแต่คุณจะเตรียมพร้อม
แก้ไขระบบหลังจากลบ

ยกเลิกการลบเคอร์เนลหรือไม่ [ใช่ไม่ใช่]

แผนผังกระบวนการ (ตัดตอนมาจาก ps -axf) มีลักษณะดังนี้:

    828 ? Ss 0:00 /usr/sbin/cron -f
  92591 ? S 0:00 \_ /usr/sbin/CRON -f
  92592 ? Ss 0:00 \_ /bin/sh -c /usr/local/sbin/remove_old_kernels.sh >> /var/log/remove_old_kernels.log 2>&1
  92593 ? S 0:00 \_ /bin/bash /usr/local/sbin/remove_old_kernels.sh
  92598 ? S 0:14 \_ apt-get purge -y linux-image-5.4.0-100-generic
  92785 pts/0 Ss+ 0:00 \_ /usr/bin/dpkg --status-fd 26 --no-triggers --force-depends --abort-after=1 --remove linux-generic:amd64 linux-image -generic:amd64 linux-modules-extra-5.4.0-100-generic:amd64 linux-image-5.4.0-100-generic:amd64
  92798 pts/0 S+ 0:00 \_ /bin/sh /var/lib/dpkg/info/linux-image-5.4.0-100-generic.prerm ลบ
  92799 pts/0 S+ 0:00 \_ /usr/bin/perl -w /usr/share/debconf/frontend /usr/bin/linux-check-removal 5.4.0-100-generic
  92809 pts/0 S+ 0:00 \_ /usr/bin/perl /usr/bin/linux-check-removal 5.4.0-100-generic

ดังนั้น ฉลาดรับ ส่งคำขอเพื่อยืนยันทั้งๆที่ -ย ตัวเลือก. แย่กว่านั้น มันสังเกตเห็นด้วยซ้ำว่ามันไม่มีหนทางที่จะติดต่อใครก็ได้เพื่อหาคำตอบ แต่แทนที่จะยอมแพ้อย่างชาญฉลาด มันกลับสร้างสถานีเทียมขึ้นจากอากาศเบาบาง และตอนนี้รอคำตอบอย่างไร้สติ

ฉันจะหลีกเลี่ยงพฤติกรรมนั้นและป้องกันได้อย่างไร ฉลาดรับ จากการถามคำถามใด ๆ เมื่อรันโดยไม่มีเทอร์มินัล?

Artur Meinild avatar
vn flag
ดูเหมือนว่าคุณกำลังเลือกวิธีแก้ปัญหาที่ไม่จำเป็นสำหรับสิ่งนี้ ([ปัญหา XY](https://xyproblem.info/)) โดยค่าเริ่มต้น Ubuntu 20.04 จะลบเคอร์เนลเก่าออก เหลือเพียงเคอร์เนลปัจจุบันและเคอร์เนลเก่า ดังนั้นฉันคิดว่าคุณควรค้นหาสาเหตุที่ฟังก์ชันเริ่มต้นไม่ทำงานและกู้คืนสิ่งนี้
nobody avatar
gh flag
`sudo apt autoremove --purge` ไม่ทำงานหรือไม่
N0rbert avatar
zw flag
ใส่ `purge-old-kernels` จากแพ็คเกจ 'byobu` ไปที่ cron job แทนการเขียนสิ่งที่เป็นอันตรายซึ่งอาจทำให้ระบบไม่สามารถบูตได้
user535733 avatar
cn flag
ดูเหมือนว่าตรรกะของ cronjob ของคุณเป็นปัญหา งานของคุณคือการขอให้ apt ทำลายระบบของคุณ และ apt ค่อนข้างจะรับรู้ถึงผลกระทบของหายนะได้ถูกต้อง และต้องการการยืนยันจากมนุษย์ นั่นไม่ใช่จุดบกพร่องที่ต้องแก้ไข...เป็นคุณลักษณะด้านความปลอดภัยของ apt ที่ดำเนินการอย่างดี คุณสามารถหลีกเลี่ยงการแฮงค์ได้เพียงแค่ไม่ขอให้ apt ทำลายระบบของคุณ
Tilman avatar
cn flag
ฉันพยายามเป็นเวลาหลายเดือนโดยเปล่าประโยชน์เพื่อให้พฤติกรรมมาตรฐานที่ถูกกล่าวหาหรือ `apt autoremove` หรือ 'purge-old-kernels' ทำงานก่อนที่จะหันไปสร้างของตัวเอง แต่ฉันยินดีที่จะรับคำตอบที่ให้วิธีแก้ปัญหาที่ได้ผล ที่กล่าวว่างานของฉันไม่ *ไม่* ขอให้ apt-get ทำลายระบบของฉัน เพียงเพื่อให้ทำงานตามที่บันทึกไว้ในหน้าคน
nobody avatar
gh flag
คุณได้ติดตั้งสภาพแวดล้อมเดสก์ท็อปแล้วหรือยัง
user535733 avatar
cn flag
ดูเหมือนว่าจะไม่ทำงานตามที่บันทึกไว้ว่าเป็นข้อบกพร่องที่ชัดเจน: โปรดส่งรายงานข้อบกพร่อง และขอขอบคุณสำหรับการค้นพบและรายงานข้อบกพร่อง นอกเหนือจากนั้น จนกว่าจุดบกพร่องจะได้รับการแก้ไข งานของคุณไม่ควรขึ้นอยู่กับพฤติกรรมของจุดบกพร่อง ฉันแนะนำให้ทดสอบก่อนเพื่อหลีกเลี่ยงการพยายามลบเคอร์เนลที่กำลังทำงานอยู่
Tilman avatar
cn flag
@nobody: ไม่มีสภาพแวดล้อมเดสก์ท็อป
PonJar avatar
in flag
ทำไมไม่แนะนำการทดสอบเพื่อสิ้นสุดงานหากเคอร์เนลที่เลือกเป็นเคอร์เนลที่กำลังทำงานอยู่
Tilman avatar
cn flag
นั่นจะช่วยแก้ไขสถานการณ์เฉพาะนั้นได้แต่ฉันจะแน่ใจได้อย่างไรว่านี่เป็นสถานการณ์เดียวที่ 'apt-get' สามารถบล็อกการรออินพุตแบบโต้ตอบเมื่อทำงานแบบไม่โต้ตอบ
PonJar avatar
in flag
อาจไม่ใช่สถานการณ์เดียวที่ต้องใช้อินพุตแบบโต้ตอบ อย่างไรก็ตาม หากยังไม่เกิดขึ้น ก็น่าจะเกิดขึ้นไม่บ่อยนัก กระบวนการใด ๆ อาจพบกับสิ่งที่ไม่คาดฝัน คุณเพียงแค่ต้องทำให้แน่ใจว่าคุณรู้ว่าเมื่อใดจะเกิดขึ้นและคิดใหม่ คุณไม่จำเป็นต้องใช้สคริปต์นี้เลย คำถามที่ดีกว่าคือคุณจะป้องกันปัญหานี้ได้อย่างไรตั้งแต่แรก
Tilman avatar
cn flag
ใช่ และถ้าคำตอบ (ยังคงค้างอยู่) สำหรับคำถามเดิมของฉันคือ "คุณทำไม่ได้" (อย่างที่ฉันเริ่มสงสัย) นั่นหมายความว่า "อย่าใช้ `apt` ใน cronjobs"
PonJar avatar
in flag
หากคุณตั้งค่าการอัปเกรดแบบอัตโนมัติ คุณสามารถระบุการลบเคอร์เนลที่ไม่ได้ใช้
Tilman avatar
cn flag
ฉันจะไม่ การอัปเกรดต้องได้รับการอนุมัติผ่านขั้นตอนการเผยแพร่ที่นี่

โพสต์คำตอบ

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