Система инициализации. Systemd
- Host OS: Windows 10.0.19043
- Guest OS: CentOS 7.8.2003
- VirtualBox: 6.1.34
- Vagrant: 2.2.19
- Создание сервиса, выполняющего периодический мониторинг лога на предмет ключевого слова
- Создание unit-файла сервиса из init-скрипта
- Конфигурация для запуска нескольких инстансов сервиса apache httpd
Создание файла конфигурации сервиса, используется ключевое слово ALERT
:
cat >> /etc/sysconfig/watchlog << EOF
WORD="ALERT"
LOG=/var/log/watchlog.log
EOF
Исполняемый модуль сервиса:
cat >> /opt/watchlog.sh << EOF
#!/bin/bash
WORD=\$1
LOG=\$2
DATE=\`date\`
if grep \$WORD \$LOG &> /dev/null
then
logger "\$DATE: Keyword found in log"
else
exit 0
fi
EOF
chmod +x /opt/watchlog.sh
Unit-файл сервиса:
cat >> /lib/systemd/system/watchlog.service << EOF
[Unit]
Description=Test watchlog service
[Service]
Type=oneshot
EnvironmentFile=/etc/sysconfig/watchlog
ExecStart=/opt/watchlog.sh \$WORD \$LOG
EOF
Unit-файл таймера, запускающего сервис каждые 30 секунд:
cat >> /lib/systemd/system/watchlog.timer << EOF
[Unit]
Description=Run watchlog script every 30 second
Requires=watchlog.service
[Timer]
#Run every 30 seconds
OnUnitActiveSec=30
Unit=watchlog.service
[Install]
WantedBy=multi-user.target
EOF
При запуске таймера и записи ключевого слова в лог:
[root@otus ~]# systemctl start watchlog.timer
[root@otus ~]# echo 'ALERT' > /var/log/watchlog.log
В системном журнале сообщения:
[root@otus ~]# tail -f /var/log/messages
Jul 1 00:34:35 localhost systemd: Started Test watchlog service.
Jul 1 00:35:05 localhost systemd: Starting Test watchlog service...
Jul 1 00:35:06 localhost root: Fri Jul 1 00:35:06 UTC 2022: Keyword found in log
Jul 1 00:35:06 localhost systemd: Started Test watchlog service.
Jul 1 00:35:36 localhost systemd: Starting Test watchlog service...
Jul 1 00:35:36 localhost root: Fri Jul 1 00:35:36 UTC 2022: Keyword found in log
Jul 1 00:35:36 localhost systemd: Started Test watchlog service.
Jul 1 00:36:06 localhost systemd: Starting Test watchlog service...
Jul 1 00:36:06 localhost root: Fri Jul 1 00:36:06 UTC 2022: Keyword found in log
Jul 1 00:36:06 localhost systemd: Started Test watchlog service.
Состояние сервисов:
[root@otus ~]# systemctl status watchlog.service
● watchlog.service - Test watchlog service
Loaded: loaded (/usr/lib/systemd/system/watchlog.service; static; vendor preset: disabled)
Active: inactive (dead) since Fri 2022-07-01 00:41:37 UTC; 4s ago
Process: 28429 ExecStart=/opt/watchlog.sh $WORD $LOG (code=exited, status=0/SUCCESS)
Main PID: 28429 (code=exited, status=0/SUCCESS)
Jul 01 00:41:37 otus systemd[1]: Starting Test watchlog service...
Jul 01 00:41:37 otus systemd[1]: Started Test watchlog service.
[root@otus ~]# systemctl status watchlog.timer
● watchlog.timer - Run watchlog script every 30 second
Loaded: loaded (/usr/lib/systemd/system/watchlog.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Fri 2022-07-01 00:31:01 UTC; 10min ago
Jul 01 00:31:01 otus systemd[1]: Started Run watchlog script every 30 second.
[root@otus ~]# systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2022-07-01 00:42:07 UTC 7s left Fri 2022-07-01 00:41:37 UTC 22s ago watchlog.timer watchlog.service
Fri 2022-07-01 14:25:48 UTC 13h left Thu 2022-06-30 14:25:48 UTC 10h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
2 timers listed.
Pass --all to see loaded but inactive timers, too.
Установка spawn-fcgi и необходимых пакетов:
yum install -y epel-release && yum install -y spawn-fcgi php php-cli mod_fcgid httpd
Unit-файл сервиса spawn-fcgi
:
cat >> /lib/systemd/system/spawn-fcgi.service << EOF
[Unit]
Description=Spawn-fcgi startup service by Otus
After=network.target
[Service]
Type=simple
PIDFile=/var/run/spawn-fcgi.pid
EnvironmentFile=/etc/sysconfig/spawn-fcgi
ExecStart=/usr/bin/spawn-fcgi -n \$OPTIONS
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
Раскомментирование опций в конфиг-файле:
sed -i 's/#SOCKET/SOCKET/' /etc/sysconfig/spawn-fcgi
sed -i 's/#OPTIONS/OPTIONS/' /etc/sysconfig/spawn-fcgi
Запуск сервиса и его статус:
[root@otus ~]# systemctl start spawn-fcgi.service
[root@otus ~]#
[root@otus ~]# systemctl status spawn-fcgi.service
● spawn-fcgi.service - Spawn-fcgi startup service by Otus
Loaded: loaded (/usr/lib/systemd/system/spawn-fcgi.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2022-06-30 14:21:01 UTC; 10h ago
Main PID: 3122 (php-cgi)
CGroup: /system.slice/spawn-fcgi.service
├─3122 /usr/bin/php-cgi
├─3123 /usr/bin/php-cgi
├─3124 /usr/bin/php-cgi
├─3125 /usr/bin/php-cgi
├─3126 /usr/bin/php-cgi
├─3127 /usr/bin/php-cgi
├─3128 /usr/bin/php-cgi
├─3129 /usr/bin/php-cgi
├─3130 /usr/bin/php-cgi
├─3131 /usr/bin/php-cgi
├─3132 /usr/bin/php-cgi
├─3133 /usr/bin/php-cgi
├─3134 /usr/bin/php-cgi
├─3135 /usr/bin/php-cgi
├─3136 /usr/bin/php-cgi
├─3137 /usr/bin/php-cgi
├─3138 /usr/bin/php-cgi
├─3139 /usr/bin/php-cgi
├─3140 /usr/bin/php-cgi
├─3141 /usr/bin/php-cgi
├─3142 /usr/bin/php-cgi
├─3143 /usr/bin/php-cgi
├─3144 /usr/bin/php-cgi
├─3145 /usr/bin/php-cgi
├─3146 /usr/bin/php-cgi
├─3147 /usr/bin/php-cgi
├─3148 /usr/bin/php-cgi
├─3149 /usr/bin/php-cgi
├─3150 /usr/bin/php-cgi
├─3151 /usr/bin/php-cgi
├─3152 /usr/bin/php-cgi
├─3153 /usr/bin/php-cgi
└─3154 /usr/bin/php-cgi
Jun 30 14:21:01 otus systemd[1]: Started Spawn-fcgi startup service by Otus.
Подготовка Unit-файла:
cp /lib/systemd/system/httpd.service /lib/systemd/system/httpd@.service
sed -i 's|EnvironmentFile=/etc/sysconfig/httpd|&-%i|' /lib/systemd/system/httpd@.service
Создание файлов окружений из стандартного путём копирования и изменения опций конфиг-файлов:
cp /etc/sysconfig/httpd /etc/sysconfig/httpd-first
cp /etc/sysconfig/httpd /etc/sysconfig/httpd-second
sed -i 's|#OPTIONS=|OPTIONS=-f conf/first.conf|' /etc/sysconfig/httpd-first
sed -i 's|#OPTIONS=|OPTIONS=-f conf/second.conf|' /etc/sysconfig/httpd-second
Создание файлов конфигов для каждого экземпляра сервиса, явно указываются используемые порты (8081,8082) и Pid-файлы:
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/first.conf
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/second.conf
sed -i 's|Listen 80|&81\nPidFile /var/run/httpd-first.pid|' /etc/httpd/conf/first.conf
sed -i 's|Listen 80|&82\nPidFile /var/run/httpd-second.pid|' /etc/httpd/conf/second.conf
Запуск сервисов и их состояние после запуска:
[root@otus ~]# systemctl start httpd@first
[root@otus ~]# systemctl start httpd@second
[root@otus ~]# systemctl status httpd*
● httpd@second.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd@.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2022-06-30 14:49:22 UTC; 10h ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 3414 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/system-httpd.slice/httpd@second.service
├─3414 /usr/sbin/httpd -f conf/second.conf -DFOREGROUND
├─3415 /usr/sbin/httpd -f conf/second.conf -DFOREGROUND
├─3416 /usr/sbin/httpd -f conf/second.conf -DFOREGROUND
├─3417 /usr/sbin/httpd -f conf/second.conf -DFOREGROUND
├─3418 /usr/sbin/httpd -f conf/second.conf -DFOREGROUND
├─3419 /usr/sbin/httpd -f conf/second.conf -DFOREGROUND
└─3420 /usr/sbin/httpd -f conf/second.conf -DFOREGROUND
Jun 30 14:49:22 otus systemd[1]: Starting The Apache HTTP Server...
Jun 30 14:49:22 otus httpd[3414]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set th...is message
Jun 30 14:49:22 otus systemd[1]: Started The Apache HTTP Server.
● httpd@first.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd@.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2022-06-30 14:49:17 UTC; 10h ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 3401 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/system-httpd.slice/httpd@first.service
├─3401 /usr/sbin/httpd -f conf/first.conf -DFOREGROUND
├─3402 /usr/sbin/httpd -f conf/first.conf -DFOREGROUND
├─3403 /usr/sbin/httpd -f conf/first.conf -DFOREGROUND
├─3404 /usr/sbin/httpd -f conf/first.conf -DFOREGROUND
├─3405 /usr/sbin/httpd -f conf/first.conf -DFOREGROUND
├─3406 /usr/sbin/httpd -f conf/first.conf -DFOREGROUND
└─3407 /usr/sbin/httpd -f conf/first.conf -DFOREGROUND
Jun 30 14:49:16 otus systemd[1]: Starting The Apache HTTP Server...
Jun 30 14:49:17 otus httpd[3401]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set th...is message
Jun 30 14:49:17 otus systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
Сконфигурированные ранее порты прослушиваются сервисами:
[root@otus ~]# ss -tnlp | grep httpd
LISTEN 0 128 [::]:8081 [::]:* users:(("httpd",pid=3407,fd=4),("httpd",pid=3406,fd=4),("httpd",pid=3405,fd=4),("httpd",pid=3404,fd=4),("httpd",pid=3403,fd=4),("httpd",pid=3402,fd=4),("httpd",pid=3401,fd=4))
LISTEN 0 128 [::]:8082 [::]:* users:(("httpd",pid=3420,fd=4),("httpd",pid=3419,fd=4),("httpd",pid=3418,fd=4),("httpd",pid=3417,fd=4),("httpd",pid=3416,fd=4),("httpd",pid=3415,fd=4),("httpd",pid=3414,fd=4))
Выполняемые при конфигурировании сервера команды перенесены в bash-скрипт для автоматического конфигурирования машины при развёртывании.
После развёртывания машины стартуют сервисы watchlog.timer
, spawn-fcgi.service
, httpd@first.service
, httpd@second.service
.
Полученный в ходе работы Vagrantfile
и внешний скрипт init.sh
для shell provisioner помещены в публичный репозиторий: