Trên các máy chủ Ubuntu 20.04LTS của tôi, tôi có một công việc định kỳ để xóa các phiên bản kernel cũ để ngăn các phân vùng /boot của chúng hết dung lượng. Nó hoạt động bằng cách truy vấn với truy vấn dpkg
cho danh sách cài đặt hình ảnh linux
các gói và sau đó cho ăn tất cả trừ ba gói cuối cùng apt-get thanh lọc -y
. Điều này hoạt động tốt hầu hết thời gian.
Thỉnh thoảng, vì nhiều lý do, quá trình này sẽ chọn kernel hiện đang chạy để xóa.
Đây không phải là một vấn đề, vì theo trang chủ của nó, apt-get
với
các -y
tùy chọn chỉ nên hủy bỏ trong trường hợp đó.
Tuy nhiên, trong thực tế, điều này khiến công việc định kỳ bị treo vô thời hạn.
Đầu ra tiêu chuẩn từ công việc, được ghi lại trong một tệp, hiển thị:
Xóa linux-image-5.4.0-100-generic (5.4.0-100.113) ...
debconf: không thể khởi tạo giao diện người dùng: Hộp thoại
debconf: (TERM không được thiết lập, vì vậy giao diện người dùng của hộp thoại không sử dụng được.)
debconf: quay trở lại giao diện người dùng: Readline
Xóa linux-image-5.4.0-100-generic
--------------------------------------
Bạn đang chạy kernel (phiên bản 5.4.0-100-generic) và đang cố xóa
cùng một phiên bản.
Điều này có thể làm cho hệ thống không thể khởi động được vì nó sẽ loại bỏ
/boot/vmlinuz-5.4.0-100-generic và tất cả các mô-đun trong thư mục
/lib/modules/5.4.0-100-generic. Điều này chỉ có thể được khắc phục bằng một bản sao của kernel
hình ảnh và các mô-đun tương ứng.
Rất nên hủy bỏ việc loại bỏ hạt nhân trừ khi bạn chuẩn bị
sửa chữa hệ thống sau khi gỡ bỏ.
Hủy bỏ loại bỏ hạt nhân? [có không]
Cây quy trình (cắt từ ps -axf
) trông như thế này:
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 ? 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 xóa
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-remove 5.4.0-100-generic
Cho nên apt-get
đã gửi yêu cầu xác nhận mặc dù -y
Tùy chọn.
Tồi tệ hơn, nó thậm chí còn nhận thấy rằng nó không có phương tiện để thực sự tiếp cận bất kỳ ai để tìm câu trả lời, nhưng thay vì từ bỏ một cách khôn ngoan, nó đã tự tạo ra một thiết bị đầu cuối giả và giờ đây đang chờ đợi câu trả lời xuất hiện ở đó một cách vô nghĩa.
Làm cách nào tôi có thể tránh hành vi đó và ngăn chặn một cách đáng tin cậy apt-get
khỏi hỏi bất kỳ câu hỏi nào khi chạy mà không có thiết bị đầu cuối?