После каждой команды обновления нужно выполнять “systemctl daemon-reload”. Как это автоматизировать?

Вопрос или проблема

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

Вот расширенный вариант решения вашей задачи:

  1. Создание 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).

  2. Делаем сценарий исполняемым:
    Измените разрешения на выполнение:

    chmod +x auto-update.sh
  3. Запуск сценария:
    Теперь вы можете запускать этот скрипт, чтобы автоматически выполнять обновление и при необходимости перезагружать демон:

    ./auto-update.sh
  4. Настройка автоматизации с использованием cron (опционально):
    Если вы хотите, чтобы ваш скрипт выполнялся автоматически через определенные промежутки времени, вы можете добавить его в планировщик задач cron:

    crontab -e

    Добавьте строку, чтобы запускать сценарий, например, раз в день в 2 часа ночи:

    0 2 * * * /path/to/your/auto-update.sh

    Не забудьте заменить /path/to/your/auto-update.sh на фактический путь к вашему скрипту.

Теперь при каждом запуске вашего скрипта будет автоматически проверяться, нужно ли выполнять systemctl daemon-reload, что значительно упростит процесс обслуживания системы. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...