Вопрос или проблема
Я использую Ubuntu 24.04 LTS, которая была недавно установлена. Я заметил, что после выполнения sudo apt update
я получаю следующие предупреждения:
Предупреждение: Файл юнита, конфигурационный файл источника или drop-ins для apt-news.service изменился на диске. Запустите 'systemctl daemon-reload', чтобы перезагрузить юниты.
Предупреждение: Файл юнита, конфигурационный файл источника или drop-ins для esm-cache.service изменился на диске. Запустите 'systemctl daemon-reload', чтобы перезагрузить юниты.
После выполнения команды sudo systemctl daemon-reload
, нужно ли снова выполнять обновление пакетов? Кроме того, я хотел бы автоматизировать команду обновления так, чтобы она запускала команду “daemon-reload”, если это предупреждение появится. Однако настройка переменной в bash-скрипте для записи вывода команды sudo apt update
не показывает предупреждения, так как они выводятся непосредственно в консоль. Я пробовал использовать systemctl show --property=NeedDaemonReload --value
, как рекомендовали, а также команду systemctl status | grep -q "changed on disk"
, но ни одна из команд ничего не выводит. Есть ли способ проверить, нужно ли запускать команду systemctl daemon-reload
, а затем выполнить ее, чтобы я мог ввести одну команду для запуска скрипта вместо того, чтобы вводить обе команды для каждого обновления?
OUTPUT=$(sudo apt update 2>&1)
if echo "$OUTPUT" | grep -q "changed on disk"; then
echo "Обнаружены изменения в файлах сервисов. Выполняю systemctl daemon-reload..."
sudo systemctl daemon-reload
else
echo "Изменений в файлах сервисов не обнаружено."
fi
Если вы хотите проверить сообщения об ошибках для выявления конкретных ситуаций или ошибок и действовать соответственно, вы можете захватить сообщения об ошибках, перенаправив stderr (файл дескриптора 2) в тот же файл, что и stdout (файл дескриптора 1):
sudo "apt update >/tmp/apt-update.log 2>&1"
или использовать комбинированный оператор для перенаправления обоих сразу:
sudo "apt update &>/tmp/apt-update.log"
и затем проанализировать этот файл.
Кроме того, вы можете фильтровать и проверять ошибки напрямую, используя grep, с помощью комбинированного оператора конвеера:
if sudo "apt update |& grep -iq 'reload units'" ; then
sudo systemctl daemon-reload
fi
(Используя опцию i для игнорирования регистра и q для тихой проверки, чтобы grep не выводил лишний текст, если найдено)
Ответ или решение
Для автоматизации процесса перезагрузки системного демона после выполнения команды sudo apt update
, вы можете использовать один из следующих подходов. Ваши наблюдения о том, что предупреждения появляются в консольном выводе, а не в стандартных выходных потоках ошибки, приведут нас к разработке сценария, который будет проверять наличие подобных уведомлений.
Вот расширенный вариант решения вашей задачи:
-
Создание bash-скрипта:
Создайте новый файл сценария, напримерauto-update.sh
, и откройте его для редактирования:nano auto-update.sh
Вставьте следующий код в ваш файл:
#!/bin/bash # Обновление списка пакетов OUTPUT=$(sudo apt update 2>&1) # Проверяем, содержит ли вывод сообщения о необходимости перезагрузки демона if echo "$OUTPUT" | grep -q "changed on disk"; then echo "Обнаружены изменения в файлах службы. Выполняю systemctl daemon-reload..." sudo systemctl daemon-reload else echo "Изменений в файлах службы не обнаружено." fi
Сохраните изменения и выйдите из редактора (Ctrl + O, затем Enter, и Ctrl + X).
-
Делаем сценарий исполняемым:
Измените разрешения на выполнение:chmod +x auto-update.sh
-
Запуск сценария:
Теперь вы можете запускать этот скрипт, чтобы автоматически выполнять обновление и при необходимости перезагружать демон:./auto-update.sh
-
Настройка автоматизации с использованием cron (опционально):
Если вы хотите, чтобы ваш скрипт выполнялся автоматически через определенные промежутки времени, вы можете добавить его в планировщик задачcron
:crontab -e
Добавьте строку, чтобы запускать сценарий, например, раз в день в 2 часа ночи:
0 2 * * * /path/to/your/auto-update.sh
Не забудьте заменить
/path/to/your/auto-update.sh
на фактический путь к вашему скрипту.
Теперь при каждом запуске вашего скрипта будет автоматически проверяться, нужно ли выполнять systemctl daemon-reload
, что значительно упростит процесс обслуживания системы. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!