====== Службы ======
Службы управляются [[:linux:kernel:systemd|системой инициализации systemctl]].\\
[[https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units|Хорошая статья]]\\
**Список активных служб**
systemctl -a
systemctl -a | grep "myService"
systemctl list-units
list-init-files --type=service --state=enable
systemctl list-unit-files "my-name"
**Enable/Disable не подразумевает Start/Stop** с-но, даже после отключения службы (Disable), она продолжит работать, если уже была запущена.\\
:!: Примеры
[[https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files|Описание директив]]\\
[Unit]
Description=Kafka Service
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties > /opt/kafka/kafka.log 2>&1'
ExecStop=ExecStop= /bin/kill -2 $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]
Description=FProfilesAutoAcceleration service
After=tank.mount
After=network-online.target
[Service]
ExecStart=java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=10045 \
-Djava.rmi.server.hostname=10.10.40.204 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar FProfilesAutoAcceleration.jar \
-Xmx7G
WorkingDirectory=/opt/FProfilesAutoAcceleration
Restart=always
TimeoutSec=15
User=fprofilesac
[Install]
Alias=fac.service
:!: Инстансы Systemd
SystemD поддерживает функционал инстансов, удобно что к самому приложению особых требований не предъявляется, по сути используются повторные запуски с разными параметрами/окружениями\\
Суть в том что в юнит файле используем директиву "%i" везде где надо отразить уникальность инстанса, файл называем "myName@.service"\\
Далее, работаем с ним "systemctl start myName@one", "systemctl enable myName@two" и тд\\
Все что после собаки будет передаваться в юнит файл вместо директивы "%i", с-но гибкость очень высокая\\
Для сервиса спокойно можно создать два юнит-файла, дял единичного и для мульти (хотя хз надо ли)\\
Интересно что итогового юнит файла у зареганной службы нигде нет, есть только этот с собакой "myservice@.service"\\
При обращении к службе, переданное после собаки название просто подставляется в этот шаблон, так и работет похоже\\
Странно что после удаления пакета остается в зареганной службе, хоть и пишет что unit file not found\\
Пример мульти конфига\\
[Unit]
Description="myName for %i instance"
Requires=network-online.target consul.service
Wants=openvpn-server.service zfs.target
After=network-online.target openvpn-server.service zfs.target consul.service
[Service]
ExecStartPre=rm -f /opt/myName/log/%i.stdout
WorkingDirectory=/opt/myName
Environment=PYTHONUNBUFFERED=1
Type=exec
ExecStart=/usr/bin/python3 /opt/myName/myName.py -l critical -c %i_config.yaml -f log/%i.log
ExecStartPost=/bin/sleep 45
ExecStartPost=kill -0 $MAINPID
TimeoutStartSec=60
#Restart=on-failure
#RestartSec=5s
StandardOutput=file:/opt/myName/log/%i.stdout
[Install]
WantedBy=multi-user.target