На моем ноутбуке я использую MySQL и PostgreSQL только для тестирования. Они мне не нужны, пока я не начну программировать, что может произойти через несколько часов после запуска. Но запускать службы вручную и вводить мой пароль sudo - (незначительное) раздражение.
Я читал, что systemd поддерживает запуск служб только при доступе к порту для этой службы. Но быстрый поиск в Google, похоже, показывает, что активация на основе сокетов еще не поддерживается в PG & MySQL.
Я понимаю, что могу взломать это с помощью сценариев оболочки или подождать, пока сопровождающие исправят сервисы, но сейчас я ищу лучший способ (в образовательных целях).
Вопрос: Как я могу добиться запуска таких сервисов по требованию так, чтобы они либо использовали функции systemd, либо рекомендовались в качестве «лучшей практики» Linux?
Некоторые мысли:
- Могу ли я установить службу, которая обрабатывает службы автоматического запуска и автоматической остановки в зависимости от условий (например, запуска конкретного процесса)?
- Существует ли прокси-служба, которая активируется сокетом и, в свою очередь, запускает целевую службу?
systemd 229, Kubuntu 16.04, MySQL 5.7, PostgreSQL 9.5
Обновление: ответ:
Как я использовал systemd-socket-proxyd в соответствии с предложением Siosm:
/etc/mysql/mysql.conf.d/mysqld.cnf
port = 13306
/etc/systemd/system/proxy-to-mysql.socket
[Socket]
ListenStream=0.0.0.0:3306
[Install]
WantedBy=sockets.target
/etc/systemd/system/proxy-to-mysql.service
[Unit]
Requires=mysql.service
After=mysql.service
[Service]
# note: this path may vary
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:13306
PrivateTmp=no
PrivateNetwork=no
Перезагрузить / остановить / запустить при необходимости:
sudo systemctl daemon-reload
sudo systemctl enable proxy-to-mysql.socket
sudo systemctl start proxy-to-mysql.socket
sudo systemctl stop mysql.service # for testing
Тестовое задание:
sudo systemctl status proxy-to-mysql.socket # should be ACTIVE
sudo systemctl status proxy-to-mysql # should be INACTIVE
sudo systemctl status mysql # should be INACTIVE
telnet 127.0.0.1 3306
sudo systemctl status proxy-to-mysql # should be ACTIVE
sudo systemctl status mysql # should be ACTIVE