Автозапуск упавшего сервиса в systemd

Достаточно часто бывает необходимость не позволять сервисам падать «наглухо», а рестартовать их в случае аварийного завершения. Systemd позволяет это сделать достаточно просто.

Рассмотрим в качестве примера древний сервис php5-fpm:

systemctl status php5-fpm.service
● php5-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-06-30 10:14:55 MSK; 12h ago
  Process: 9349 ExecStartPre=/usr/lib/php5/php5-fpm-checkconf (code=exited, status=0/SUCCESS)
 Main PID: 9354 (php5-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 499, slow: 0, Traffic: 0req/sec"
    Tasks: 6 (limit: 4700)
   Memory: 857.9M
   CGroup: /system.slice/php5-fpm.service
           ├─ 9354 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
           ├─ 9357 php-fpm: pool web19
           ├─ 9358 php-fpm: pool web19
           ├─ 9359 php-fpm: pool www
           ├─ 9360 php-fpm: pool www
           └─20671 php-fpm: pool www

Открываем на редактирование файл /lib/systemd/system/php5-fpm.service и видим обычное содержимое:

[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service] 
Type=notify
PIDFile=/var/run/php5-fpm.pid
ExecStartPre=/usr/lib/php5/php5-fpm-checkconf
ExecStart=/usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

В случае некорректного завершения его работы, он не перезапустится автоматически и сайты, которые он ещё обслуживает, будут недоступны. Чтобы сервис перезапустился автоматически, нужно в секцию Unit добавить следующий строки:

StartLimitIntervalSec=500
StartLimitBurst=5

А в секцию Service добавить:

Restart=on-failure
RestartSec=5s

После добавления нужно заставить systemd перечитать конфиги:

systemctl daemon-reload

И теперь, если сервис вдруг остановится по незапланированным причинам, в течение 5 секунд он будет перезапущен. Попыток рестарта сервиса будет 5 в течение 500 секунд и если все эти попытки закончатся неудачей, дальнейших попыток перезапуска не будет. Этого времени должно хватить сисадмину, чтобы среагировать на проблему вручную. 🙂

a2dp-sink profile connect failed

После очередного обновления системы перестали работать беспроводные наушники. Подключаться пытаются, но безуспешно. Начал разбираться, что пошло не так. 🙂

Для начала пересобрал и обновил модуль. Ошибок стало меньше, но наушники всё так же не хотели подключаться, в логах была ошибка:

bluetoothd[xxxx]: src/service.c:btd_service_connect() a2dp-sink profile connect failed for XX:XX:XX:XX:XX:XX: Protocol not available

Проблема решилась добавлением в конфиг pulseaudio /etc/pulse/default.pa загрузки модуля module-bluez5-discover:

load-module module-bluez5-discover

Перезапускаем PulseAudio:

killall pulseaudio

Подключаем наушники, в логах не видим ошибок — всё прошло успешно. 🙂

Скрипт автоматизированной компиляции ядра Linux — теперь на GitHub

Скрипт автоматизированной компиляции ядра Linux из одноимённой записи переполз в GitHub — https://github.com/alex-clumsy/linuxkernelbuilder. Также он подвергся дополнительным изменениям, которые, как мне думается, пошли ему на пользу. И в целом, я решил немного выйти из тени и поделиться своими наработками. Вдруг кому-то будут полезны. 🙂

Установка и настройка Jitsi meet с поддержкой JWT токенов в Debian Linux

Подразумевается, что вы знаете, что такое Jitsi Meet и для чего он нужен. Ниже я приведу инструкции по установке и настройке, которые решают проблему несовместимости Lua 5.2 и Lua 5.1. На возможных проблемах с сертификатами я останавливаться не буду, если у вас вдруг что-то идёт не так — напишите в комментариях, попробуем разобраться вместе. Как правило, установка проходит без проблем, они начинаются дальше. 🙂

Итак, поехали:

wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | apt-key add -
sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list"
apt-get -y update && apt-get -y install jitsi-meet certbot
apt install git cmake luarocks libssl-dev liblua5.2
wget http://packages.prosody.im/debian/pool/main/p/prosody-trunk/prosody-trunk_1nightly1273-1~buster_amd64.deb
dpkg -i prosody-trunk_1nightly1273-1~buster_amd64.deb
apt-get install jitsi-meet-tokens prosody-modules lua5.2 liblua5.2 luarocks libssl-dev
luarocks install basexx

Добавим в конец файла /etc/prosody/prosody.cfg.lua строчку:

Include "conf.d/*.cfg.lua"

Также отключим обязательное шифрование между клиентом и сервером:

c2s_require_encryption = false

Поставим модуль lua-cjson:

luarocks download lua-cjson
luarocks unpack lua-cjson-2.1.0.6-1.src.rock

В файле lua-cjson-2.1.0.6-1/lua-cjson/lua_cjson.c поменяем строку 743:

len = lua_objlen(l, -1);

на

len = lua_rawlen(l, -1);

И выполним установку модуля:

cd lua-cjson-2.1.0.6-1/lua-cjson
luarocks make

Требуемый модуль luajwtjitsi не работает в Debian с Lua 5.1, используем доработанную версию:

cd
git clone https://github.com/ASolomatin/luajwt.git
cd luajwt

Внесём изменения в файл luajwtjitsi-1.3-7.rockspec:

source = {
        url = "git://github.com/ASolomatin/luajwt/",
        tag = "replace_luacrypto"
}

dependencies = {
       "lua >= 5.2",
       "luaossl >= 20190731-0",
       "lua-cjson >= 2.1.0",
       "lbase64 >= 20120807-3"
}

После этого выполним установку модуля:

luarocks install luajwtjitsi-1.3-7.rockspec

После всех этих манипуляций перезапустим prosody:

systemctl restart prosody

Убедимся, что в /var/log/prosody/prosody.err не ошибок. Теперь у вас должна заработать аутентификация с помощью JWT токенов.

Более подробная документация про токены — https://github.com/jitsi/lib-jitsi-meet/blob/master/doc/tokens.md.

Генерация пароля в Unix/Linux

С задачей генерации пароля мы сталкиваемся довольно часто. А уж админы так и вообще иной раз по несколько паролей за день генерируют. Когда фантазия заканчивается, можно не проводить очередные рандомные удары по клавиатуре в надежде получить что-то более-менее похожее на хороший пароль, а воспользоваться готовыми решениям. Одно из таких решений — утилита makepasswd.

Если она у вас не установлена — ставим её:

apt-get install makepasswd

Пользоваться makepasswd довольно просто:

alexey@ws:~$ makepasswd 
tTD7hs3J8

По умолчанию генерируется пароль из 8 символов. Если хочется пароль подлиннее, например из 20 символов:

alexey@ws:~$ makepasswd --chars=20
jeDewHoSI3PBzYKESMHD

Нужно сгенерировать сразу 10 паролей? Не вопрос!

alexey@ws:~$ makepasswd --chars=20 --count=10
2nPjfzwmaePqvy95oWfd
WTqHSrJcx3yhYzvo9p5M
NU6mJrjYi6SvG3VKppfo
wcW8N6SpnDxCoCVGGPRv
dv3P318GoSaNGY3TifzQ
J3Nm39HBfaFRSW88FQzr
sfImruyf5Ua30bUrCKiG
3IuabxbDtQvVio6EeFP7
pCnvUCLiUo6tUiBVMEPQ
t7YxtWtI1GCC5vpa1d1w

Легко, удобно, быстро.

У утилиты есть дополнительные возможности, увидеть которые можно, запустив её с ключом −−help. Надеюсь, статья была полезной и данная утилита поможет вам сэкономить время для более полезной мозговой деятельности. 🙂