Следующий код используется, чтобы проверить, установлена ли служба (считанная из переменной, может быть пустой или до 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
Ссылаясь на 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
systemctl list-unit-files
Предположим, что вы проверили имена служб, которые соответствуют пакетам, как предлагается:
'@'
и '.'
. Точно так же найдите список всех услуг. С другой стороны, обработка списка с помощью метода rpm -qf
занимает около 30 секунд со 100% успехом.
Попробуйте следующее:
for f in $SERVICE; do if ! rpm -qa \| grep -qw $f; then ... fi; done
Я уверен, что мой первоначальный вопрос не предоставил спецификаций в деталях, которые вам нужны, и что предложенные вами решения будут работать - но в моем случае они работают лишь частично.
Однако, вы направили меня на правильный (для меня) путь и следующее решение делает то, что мне нужно - уверен, что есть лучшие подходы, но по крайней мере оно работает и я понимаю, что происходит :)
Спасибо за вашу поддержку в этом.
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