在我的笔记本电脑上,我仅使用 MySQL 和 PostgreSQL 进行测试。在我开始编程之前我不需要它们,这可能是启动后几个小时。但是手动启动服务并输入我的 sudo 密码是一个(小)烦恼。
我读到 systemd 仅在访问该服务的端口时才支持启动服务。但是在 Google 上的快速搜索似乎表明 PG 和 MySQL 尚不支持基于套接字的激活。
我意识到我可以使用 shell 脚本来破解它或等待维护者修复服务,但我现在正在寻找更好的方法(用于教育目的)。
问题:如何以利用 systemd 功能或被推荐为 Linux“最佳实践”的方式实现此类服务的按需启动?
一些想法:
systemd 229、Kubuntu 16.04、MySQL 5.7、PostgreSQL 9.5
更新:答案:
我如何按照 Siosm 的建议使用 systemd-socket-proxyd:
/etc/mysql/mysql.conf.d/mysqld.cnf
port = 13306
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/proxy-to-mysql.socket
[Socket]
ListenStream=0.0.0.0:3306
[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
根据需要重新加载/停止/启动:
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
Run Code Online (Sandbox Code Playgroud)
测试:
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
Run Code Online (Sandbox Code Playgroud)
您可以使用该systemd-socket-proxyd工具通过套接字激活将流量从本地套接字转发到 MySQL 或 PostgreSQL。有关示例,请参阅systemd-socket-proxyd(8),并阅读此 SO 回复以获取--usersystemd的具体示例。
PostgreSQL 和 MySQL 尚不支持基于套接字的激活。
问题就是答案。你已经找到了更好的方法,在问题中提到了,然后又声明没有实现。Oracle 关闭了该问题,称套接字激活(实际上,就服务器程序而言,使用已打开的侦听文件描述符而不是打开自己的文件描述符)已实现,但实际上尚未实现。MariaDB 有一个仍然悬而未决的问题。至于 PostgreSQL,你和 Christoph Berg 一样在等待它的实现。
| 归档时间: |
|
| 查看次数: |
2465 次 |
| 最近记录: |