CentOS下systemd运行Flask硬件服务失败:app.sock未生成
问题分析与解决
核心问题定位
从systemd服务状态日志里的* Running on unix:////app.sock可以看出,Flask实际绑定的socket路径是根目录下的app.sock,而非预期的/usr/bin/app.sock,结合CentOS特性,主要存在以下三类问题:
1. Unix Socket路径写法错误
你的hardware_service.py中路径定义有误:
app.run(host="unix://usr/bin/app.sock")
Flask要求Unix Socket绝对路径需以三个斜杠开头(unix:///),unix://是协议头,后续的斜杠用于标识根目录。原写法会被解析为相对路径,在systemd默认工作目录(通常为/)下生成socket文件,而非/usr/bin目录。
2. /usr/bin目录的权限与SELinux限制
/usr/bin是系统二进制文件专属目录,默认不适合存放socket文件;且CentOS默认开启SELinux强制模式,会拦截服务在该目录下创建非标准文件,即使root用户运行也会受限。
3. systemd服务配置缺失
- 未指定工作目录:默认工作目录为
/,易引发路径解析混乱 - 未添加socket清理逻辑:服务重启时若残留旧socket,会导致启动失败
- 日志提示
Current command vanished from the unit file:可能是进程脱离systemd管控,需明确进程类型
修复步骤
第一步:修正Flask Socket路径与存放位置
建议使用systemd推荐的临时运行目录/run/hardware_service/(重启后自动清理),修改hardware_service.py:
if __name__ == "__main__": print("Running as service...") # 用三个斜杠指定绝对路径 app.run(host="unix:///run/hardware_service/app.sock")
手动创建目录并设置权限:
sudo mkdir -p /run/hardware_service sudo chown root:root /run/hardware_service sudo chmod 755 /run/hardware_service
第二步:完善systemd服务配置
修改/etc/systemd/system/hardware_service.service:
[Unit] Description=Hardware Monitoring Service After=network.target [Service] # 指定运行用户(若无需root,可改为普通用户并调整目录权限) User=root Group=root # 指定服务工作目录 WorkingDirectory=/home/<user> # 启动命令 ExecStart=/usr/bin/python /home/<user>/hardware_service.py # 明确进程类型,确保被systemd管控 Type=simple # 重启策略 Restart=always # 设置socket文件权限,方便客户端访问 UMask=0002 # 启动前清理残留socket ExecStartPre=/bin/rm -f /run/hardware_service/app.sock [Install] WantedBy=multi-user.target
第三步:处理SELinux(若开启)
临时关闭SELinux测试服务:
sudo setenforce 0
确认服务正常后,添加永久规则:
sudo semanage fcontext -a -t httpd_var_run_t "/run/hardware_service(/.*)?" sudo restorecon -Rv /run/hardware_service
第四步:更新客户端代码
修改client.py的socket路径:
import requests_unixsocket session = requests_unixsocket.Session() base_url = "http+unix:///run/hardware_service/app.sock" r = session.get(base_url + "/overall") print(r.status_code) print(r.text) assert r.status_code == 200
第五步:重启服务生效
sudo systemctl daemon-reload sudo systemctl restart hardware_service sudo systemctl status hardware_service
验证
- 检查socket文件是否生成:
ls -l /run/hardware_service/app.sock
- 运行客户端代码,确认连接正常:
python client.py
内容的提问来源于stack exchange,提问作者Narendra M
相关产品推荐
相关产品推荐

