You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

验证

  1. 检查socket文件是否生成:
ls -l /run/hardware_service/app.sock
  1. 运行客户端代码,确认连接正常:
python client.py

内容的提问来源于stack exchange,提问作者Narendra M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:12:23