Điểm:-1

Ngăn apt-get yêu cầu xác nhận một cách đáng tin cậy khi chạy từ cron

lá cờ cn

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?

Artur Meinild avatar
lá cờ vn
Có vẻ như bạn đang chọn một giải pháp không cần thiết cho việc này ([sự cố XY](https://xyproblem.info/)). Ubuntu 20.04 theo mặc định sẽ loại bỏ các nhân cũ, chỉ để lại nhân hiện tại và nhân cũ. Vì vậy, tôi nghĩ bạn nên tìm hiểu lý do tại sao chức năng mặc định không hoạt động và khôi phục chức năng này.
nobody avatar
lá cờ gh
`Sudo apt autoremove --purge` không hoạt động?
N0rbert avatar
lá cờ zw
Đặt `purge-old-kernels` từ gói `byobu` vào công việc định kỳ thay vì viết những thứ nguy hiểm có thể khiến hệ thống không thể khởi động được.
user535733 avatar
lá cờ cn
Có vẻ như logic cronjob của bạn là vấn đề. Công việc của bạn là yêu cầu apt phá vỡ hệ thống của bạn và apt nhận ra khá chính xác những tác động thảm khốc và do đó yêu cầu xác nhận từ con người. Đó không phải là một lỗi cần khắc phục...đó là một tính năng an toàn được triển khai tốt của apt. Bạn có thể tránh bị treo bằng cách đơn giản là không yêu cầu apt phá hệ thống của bạn.
Tilman avatar
lá cờ cn
Tôi đã cố gắng trong nhiều tháng, vô ích để làm cho hành vi tiêu chuẩn có mục đích hoặc `apt autoremove` hoặc `purge-old-kernels` hoạt động, trước khi dùng đến cách xây dựng của riêng tôi. Nhưng tôi sẽ sẵn sàng chấp nhận câu trả lời cung cấp bất kỳ giải pháp nào hiệu quả. Điều đó nói rằng, công việc của tôi * không * yêu cầu apt-get phá vỡ hệ thống của tôi, chỉ để hoạt động như tài liệu trên trang hướng dẫn của nó.
nobody avatar
lá cờ gh
Bạn đã cài đặt môi trường máy tính để bàn chưa?
user535733 avatar
lá cờ cn
Nó không hoạt động như tài liệu có vẻ là một lỗi rõ ràng: Vui lòng gửi báo cáo lỗi và cảm ơn vì đã phát hiện và báo cáo lỗi. Ngoài ra, cho đến khi lỗi được giải quyết, công việc của bạn không nên phụ thuộc vào hành vi của lỗi. Tôi khuyên bạn nên kiểm tra trước để tránh cố gắng xóa kernel hiện đang chạy.
Tilman avatar
lá cờ cn
@nobody: Không có môi trường máy tính để bàn.
PonJar avatar
lá cờ in
Tại sao không giới thiệu một thử nghiệm để kết thúc công việc nếu hạt nhân được chọn là hạt nhân đang chạy?
Tilman avatar
lá cờ cn
Điều đó sẽ giải quyết xung quanh kịch bản cụ thể đó.Nhưng làm cách nào tôi có thể chắc chắn rằng đây là trường hợp duy nhất mà `apt-get` có thể chặn chờ đầu vào tương tác khi chạy không tương tác?
PonJar avatar
lá cờ in
Đây có thể không phải là kịch bản duy nhất yêu cầu đầu vào tương tác. Tuy nhiên, nếu nó chưa xảy ra thì có thể là không thường xuyên. Bất kỳ quy trình nào cũng có thể gặp phải điều gì đó không lường trước được. Bạn chỉ cần đảm bảo rằng bạn biết khi nào nó xảy ra và suy nghĩ lại. Bạn hoàn toàn không cần kịch bản này. Một câu hỏi hay hơn là làm thế nào để bạn ngăn chặn vấn đề này ngay từ đầu.
Tilman avatar
lá cờ cn
Có, và nếu câu trả lời (vẫn chưa được trả lời) cho câu hỏi ban đầu của tôi là "bạn không thể" (như tôi bắt đầu nghi ngờ) thì điều đó có nghĩa là "không sử dụng `apt` trong cronjobs".
PonJar avatar
lá cờ in
Nếu bạn thiết lập các bản nâng cấp không giám sát, bạn có thể chỉ định loại bỏ các hạt nhân không sử dụng
Tilman avatar
lá cờ cn
Tôi sẽ không. Các bản nâng cấp cần được phê duyệt thông qua quy trình phát hành theo giai đoạn tại đây.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.