在笔记本电脑上,我仅使用MySQL和PostgreSQL进行测试。在开始编程之前(在启动后可能需要几个小时),我不需要它们。但是手动启动服务并输入我的sudo密码是一个(小)麻烦。
我读到systemd仅在访问该服务的端口时才支持启动服务。但是Google快速搜索似乎表明PG&MySQL还不支持基于套接字的激活。
我知道我可以使用shell脚本破解此代码,也可以等待维护者修复服务,但是现在(出于教育目的)我正在寻找一种更好的方法。
问题:如何以一种利用系统功能或被推荐为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
/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