在我的笔记本电脑上,我仅使用 MySQL 和 PostgreSQL 进行测试。在开始编程之前我不需要它们,这可能是在启动后几个小时。但是手动启动服务并输入我的 sudo 密码是一个(小)烦恼。
我读到 systemd 仅在访问该服务的端口时才支持启动服务。但快速的 Google 搜索似乎表明 PG 和 MySQL 尚不支持基于套接字的激活。
我意识到我可以使用 shell 脚本破解这个问题或等待维护人员修复服务,但我现在正在寻找更好的方法(出于教育目的)。
问题:如何以利用 systemd 功能或被推荐为 Linux“最佳实践”的方式实现此类服务的按需启动?
一些想法:
- 我可以安装一项服务来根据条件(例如正在运行的特定进程)处理自动启动和自动停止服务吗?
- 是否存在由套接字激活并依次启动目标服务的代理服务?
系统 229、Kubuntu 16.04、MySQL 5.7、PostgreSQL 9.5
更新: 答案:
我如何按照 Siosm 的建议使用 systemd-socket-proxyd:
/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
答案1
您可以使用该systemd-socket-proxyd
工具通过套接字激活将流量从本地套接字转发到 MySQL 或 PostgreSQL。看systemd-socket-proxyd(8)例如,并阅读此回复--user
systemd的具体示例。
答案2
PostgreSQL 和 MySQL 尚不支持基于套接字的激活。
问题就是答案。你已经找到了更好的方法,在问题中提到了,然后又声明没有实现。 Oracle 关闭了该问题,称套接字激活(实际上,就服务器程序而言,使用已打开的侦听文件描述符而不是打开自己的文件描述符)已实现,但实际上尚未实现。 MariaDB 有一个仍然悬而未决的问题。至于 PostgreSQL,你和 Christoph Berg 一样在等待它的实现。
进一步阅读
- 乔纳森·德博因·波拉德 (2016)。MariaDB 和 MySQL 与 nosh。软件。
- 大卫·施特劳斯(2014-01-17)。支持systemd套接字激活。 MDEV-5536。玛丽亚数据库。
- 哈拉尔德·雷德尔 (2011-07-21)。mysql/systemd 套接字激活。 61948.MySQL 错误跟踪器。
- 克里斯托夫·伯格(2016-01-28)。[补丁]更好的系统集成。 PostgreSQL 黑客。