进一步阅读

进一步阅读

在我的笔记本电脑上,我仅使用 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)例如,并阅读此回复--usersystemd的具体示例

答案2

PostgreSQL 和 MySQL 尚不支持基于套接字的激活。

问题就是答案。你已经找到了更好的方法,在问题中提到了,然后又声明没有实现。 Oracle 关闭了该问题,称套接字激活(实际上,就服务器程序而言,使用已打开的侦听文件描述符而不是打开自己的文件描述符)已实现,但实际上尚未实现。 MariaDB 有一个仍然悬而未决的问题。至于 PostgreSQL,你和 Christoph Berg 一样在等待它的实现。

进一步阅读

相关内容