У меня есть системы 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
Есть несколько вещей, которые я хотел бы улучшить:
cut
действительно хрупкий и ломается при изменении формата вывода systemd.systemctl restart
не устанавливает код возврата при сбое запуска, поэтому сценарий продолжает работу, даже если служба не может быть остановлена или запущена.Что может быть лучше для этого?
Какие могут быть лучшие способы сделать это?
Перезагрузите сервер :)
Перезапуск всех служб редко бывает хорошей идеей. Либо вы обновляете всю систему, а затем хотите убедиться, что все использует последние исправленные библиотеки. Или вы обновляете / перенастраиваете только одну службу, а затем простую systemctl reload whatever.service
должно быть достаточно, не нужно перезапускать все запущенные службы.
Кроме того, рекомендуется время от времени перезагружать сервер, чтобы убедиться, что он действительно является перезагружаемый. Я видел серверы с годами безотказной работы, которые никто не осмеливался перезагрузить, потому что никто не знал, действительно ли они вернутся, какие изменения были внесены, а не сохранены и т. Д.
Если это критическая система он наверняка находится в каком-то кластере высокой доступности, и перезагрузка одного узла не имеет значения. Если это не критическая система вы можете перезагрузить его даже в нерабочее время или на выходных.
Итак, чтобы ответить на ваш вопрос - перезагрузите сервер
Чтобы улучшить свой код, вы можете сделать следующее:
--state running
вместо того grep running
для фильтрации нужных вам услуг.grep -v -f exclude-services.list
вместо цепочки grep
с 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}
Это может быть немного надежнее, чем ваш сценарий. Дай мне знать, как дела.