Использование rpm / grep для проверки наличия нескольких служб - как один лайнер?

Следующий код используется, чтобы проверить, установлена ​​ли служба (считанная из переменной, может быть пустой или до X названных служб), и предпринять соответствующие действия.

... if ! rpm -qa | grep -qw $SERVICE; then ...

Как я могу добиться того же, но позволяя устанавливать и читать переменные из следующих форматов:

Опция - переменные в одной строке, разделенные одним пробелом: Пример: SERVICE = httpd mariadb mariadb-server

В основном я хочу, чтобы одна строка проверяла, установлена ​​ли служба (может быть от 0 до 99).

Полная идея:

SERVICE=mariadb httpd

if [ "`systemctl is-active $SERVICE`" != "active" ]; then
  if ! rpm -qa | grep -qw $SERVICE; then 
    yum -y install $SERVICE;
    echo "$SERVICE has been installed.";
  else systemctl start $SERVICE && echo "$SERVICE started"; \
  fi
fi
0
22.03.2016, 22:32
3 ответа

Ссылаясь на CentOS 6, служба будет соответствовать одному из имен файлов в /etc/rc.d/init.d

Для ваших целей игнорируйте случайный сценарий настраиваемой службы, который не поступает из RPM, а просто выполните

for f in $SERVICE; do s=/etc/rc.d/init.d/$f; [ -f "$s" ] && rpm -qf "$s"; done

. Это проверит наличие служебного файла и напечатает имя соответствующего пакета. Если служебный файл отсутствует, ничего не печатается.

При проверке синтаксиса я создал сценарий, установив SERVICE из аргументов командной строки, например,

SERVICE="$*"

, и показан пример ввода / вывода:

$ /tmp/foo avahi-daemon blk-availability bluetooth certmonger cgconfig cgred cpusp
eed crond
avahi-0.6.25-15.el6.x86_64
lvm2-2.02.118-3.el6_7.4.x86_64
bluez-4.66-1.el6.x86_64
certmonger-0.77.5-1.el6.x86_64
libcgroup-0.40.rc1-16.el6.x86_64
libcgroup-0.40.rc1-16.el6.x86_64
cpuspeed-1.5-22.el6.x86_64
cronie-1.4.4-15.el6_7.1.x86_64

Для этого, в вашем примере

if ! rpm -qa | grep -qw $SERVICE; then 

вы замените его на

if [ -z "$( rpm -qf /etc/rc.d/init.d/$SERVICE 2>/dev/null )" ] ; then

. Если служебный файл отсутствует, rpm напишет сообщение об ошибке в стандартную ошибку. Если он присутствует, но не из RPM, rpm вернет сообщение на стандартный вывод (который согласован: вы не должны устанавливать что-то для замены пользовательского сценария).

Для CentOS 7, используя systemd , вы можете использовать ту же идею, но с другим расположением каталогов. Он хранит файлы ".service" в

/usr/lib/systemd/system/

, которые можно протестировать как

if [ -z "$( rpm -qf /usr/lib/systemd/system/${SERVICE}.service 2>/dev/null )" ] ; then

. На моем компьютере с CentOS 7

  • имеется 384 файловых единиц , перечисленных в systemctl list-unit-files
  • 101 отключены в конфигурации по умолчанию
  • 275 - это файлы «.service»
  • , остальные (109) имеют суффикс «.mount», «.path», «.slice», «.socket», ".target"

Предположим, что вы проверили имена служб, которые соответствуют пакетам, как предлагается:

  • Около дюжины имен службы включают символы, которые не будут использоваться в имени пакета, например, '@' и '.' . Точно так же найдите список всех услуг.
  • Требуется некоторое время (около 5 минут для обработки всего списка), и не удается найти что-либо для 220 из списка (20% успех).
  • Многие совпадения являются случайными, поскольку обнаружено несколько пакетов (считайте это еще 70% ошибкой).
  • В целом, это 5% успеха.

С другой стороны, обработка списка с помощью метода rpm -qf занимает около 30 секунд со 100% успехом.

1
28.01.2020, 02:35

Попробуйте следующее:

for f in $SERVICE; do if ! rpm -qa \| grep -qw $f; then ... fi; done
1
28.01.2020, 02:35

Я уверен, что мой первоначальный вопрос не предоставил спецификаций в деталях, которые вам нужны, и что предложенные вами решения будут работать - но в моем случае они работают лишь частично.

Однако, вы направили меня на правильный (для меня) путь и следующее решение делает то, что мне нужно - уверен, что есть лучшие подходы, но по крайней мере оно работает и я понимаю, что происходит :)

Спасибо за вашу поддержку в этом.

PACKAGE="mariadb-server httpd"
SERVICE="mariadb httpd"

for f in $PACKAGE
do
  if ! rpm -qa \| grep -qw ${f}
  then
    yum -y install ${f}
  fi
done

for f in $SERVICE
do
  if [ "systemctl is-active ${f}" != "active" ]
  then
    systemctl enable ${f}
    systemctl start ${f}
  fi
done
0
28.01.2020, 02:35

Теги

Похожие вопросы