Назад | Перейти на главную страницу

Улучшения этого скрипта для перезапуска каждой запущенной службы systemd?

У меня есть системы Centos 7+, и все они используют systemd. Иногда лучший способ продолжить работу после важного изменения системы - перезапустить каждую работающую в данный момент службу. Если я перезапускаю каждую службу по очереди, то система обычно остается в сети, и очень легко увидеть проблемы обслуживания по мере их появления. Итак, я взломал этот небольшой сценарий bash, который перезапускает каждую запущенную службу systemd, ЗА ИСКЛЮЧЕНИЕМ определенных именованных служб, которые, как мне кажется, являются ключевыми для поддержания системы в сети.

#!/bin/bash
set -e
set -u
running=$(systemctl list-units --type service | grep running \
    | grep -iv audit \
    | grep -iv disk \
    | grep -iv drive \
    | grep -iv getty \
    | grep -iv irq \
    | grep -iv libstoragemgt \
    | grep -iv lvm \
    | grep -iv multipath \
    | grep -iv polkit \
    | grep -iv storage \
    | cut -d' ' -f1)

for service in $running ; do
    echo "$service"
    systemctl restart "$service"
done

Есть несколько вещей, которые я хотел бы улучшить:

Что может быть лучше для этого?

Какие могут быть лучшие способы сделать это?

Перезагрузите сервер :)

Перезапуск всех служб редко бывает хорошей идеей. Либо вы обновляете всю систему, а затем хотите убедиться, что все использует последние исправленные библиотеки. Или вы обновляете / перенастраиваете только одну службу, а затем простую systemctl reload whatever.service должно быть достаточно, не нужно перезапускать все запущенные службы.

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

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

Итак, чтобы ответить на ваш вопрос - перезагрузите сервер

Чтобы улучшить свой код, вы можете сделать следующее:

  1. использовать systemctl --state running вместо того grep running для фильтрации нужных вам услуг.
  2. использовать grep -v -f exclude-services.list вместо цепочки grepс
  3. использовать systemctl try-restart s1 s2 s3 ... все сразу, а не пролистывать список.

Сначала перечислите услуги, которые нужно исключить из exclude-services.list:

potom@vm /tmp $ cat exclude-services.list 
audit.service
disk.service
drive.service
getty.service
irq.service
libstoragemgt.service
lvm.service
multipath.service
polkit.service
storage.service

Тогда этот скрипт должен работать:

potom@vm /tmp $ cat restart-all.sh
RESTART_SERVICES=$(systemctl list-units --type service --state running | \
    awk '$1 ~ /\.service/{print $1}' | \
    grep -v -f exclude-services.list )

systemctl try-restart ${RESTART_SERVICES}

Это может быть немного надежнее, чем ваш сценарий. Дай мне знать, как дела.