Рейтинг:-1

Надежно запретить apt-get запрашивать подтверждение при запуске из cron

флаг cn

На моих серверах Ubuntu 20.04LTS у меня есть задание cron для удаления старых версий ядра, чтобы предотвратить нехватку места в их /boot-разделах. Он работает, запрашивая с dpkg-запрос для списка установленных linux-образ пакеты, а затем подача всех, кроме последних трех, в apt-получить очистку -y. Это хорошо работает большую часть времени.

Время от времени по разным причинам этот процесс выбирает для удаления работающее в данный момент ядро. Это не должно быть проблемой, так как, согласно его справочной странице, способный получить с в опция должна просто прерваться в этом случае. Однако на самом деле это приводит к тому, что задание 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-универсальный. Это можно исправить только копией ядра
изображение и соответствующие модули.

Настоятельно рекомендуется прервать удаление ядра, если вы не готовы
исправить систему после удаления.

Прервать удаление ядра? [да нет]

Дерево процессов (вырезано из пс -ахф) выглядит так:

    828 ? Сс 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 -общий:amd64 linux-modules-extra-5.4.0-100-общий:amd64 linux-image-5.4.0-100-общий: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 баллов/0 S+ 0:00 \_ /usr/bin/perl /usr/bin/linux-check-removal 5.4.0-100-generic

Так способный получить отправил запрос на подтверждение, несмотря на вариант. Хуже того, он даже заметил, что у него нет средств, чтобы на самом деле связаться с кем-либо за ответом, но вместо того, чтобы благоразумно отказаться, он создал псевдотерминал из воздуха и теперь бессмысленно ждет, когда ответ появится там.

Как я могу избежать такого поведения и надежно предотвратить способный получить от задавать какие-либо вопросы при запуске без терминала?

Artur Meinild avatar
флаг vn
Кажется, вы выбираете ненужное решение для этого ([проблема XY] (https://xyproblem.info/)). Ubuntu 20.04 по умолчанию удалит старые ядра, оставив только текущее и прежнее. Поэтому я думаю, вам следует выяснить, почему функциональность по умолчанию не работает, и восстановить это.
nobody avatar
флаг gh
sudo apt autoremove --purge не работает?
N0rbert avatar
флаг zw
Поместите `purge-old-kernels` из пакета `byobu` в задание cron вместо того, чтобы писать опасные вещи, которые могут сделать систему не загружаемой.
user535733 avatar
флаг cn
Похоже, проблема в логике вашего cronjob. Ваша работа заключается в том, чтобы попросить apt сломать вашу систему, и apt совершенно правильно понимает катастрофические последствия и поэтому требует подтверждения от человека. Это не ошибка, которую нужно обойти... это хорошо реализованная функция безопасности apt. Вы можете избежать зависания, просто не запрашивая apt, чтобы сломать вашу систему.
Tilman avatar
флаг cn
В течение нескольких месяцев я тщетно пытался заставить работать либо предполагаемое стандартное поведение, либо «apt autoremove», либо «purge-old-kernels», прежде чем прибегнуть к созданию своего собственного. Но я с радостью приму ответ, предоставляющий любое решение, которое работает. Тем не менее, моя работа *не* требует от apt-get взломать мои системы, просто вести себя так, как описано на его справочной странице.
nobody avatar
флаг gh
У вас установлена ​​среда рабочего стола?
user535733 avatar
флаг cn
Это-не-ведет себя-не-как-задокументировано кажется явной ошибкой: пожалуйста, отправьте отчет об ошибке, и спасибо за обнаружение и сообщение об ошибке. Кроме того, пока ошибка не будет устранена, ваша работа не должна зависеть от ошибочного поведения. Я предлагаю сначала протестировать, чтобы не пытаться удалить работающее в данный момент ядро.
Tilman avatar
флаг cn
@nobody: нет среды рабочего стола.
PonJar avatar
флаг in
Почему бы не ввести тест для завершения задания, если выбранное ядро ​​является работающим ядром?
Tilman avatar
флаг cn
Это обойдет этот конкретный сценарий.Но как я могу быть уверен, что это единственный сценарий, в котором `apt-get` может блокировать ожидание интерактивного ввода при неинтерактивном запуске?
PonJar avatar
флаг in
Вероятно, это не единственный сценарий, в котором требуется интерактивный ввод. Однако, если это еще не произошло, это, вероятно, будет нечастым. Любой процесс может столкнуться с чем-то неожиданным. Вам просто нужно убедиться, что вы знаете, когда это происходит, и переосмыслить. Вам вообще не нужен этот скрипт. Лучше спросить, как предотвратить эту проблему в первую очередь.
Tilman avatar
флаг cn
Да, и если (все еще нерешенный) ответ на мой первоначальный вопрос «вы не можете» (как я начинаю подозревать), то это означает «не используйте `apt` в cronjobs».
PonJar avatar
флаг in
Если вы настроили автоматические обновления, вы можете указать удаление неиспользуемых ядер.
Tilman avatar
флаг cn
Я не буду. Обновления должны быть одобрены посредством процесса поэтапного выпуска здесь.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.