是否有一种安全的方法可以在运行相关服务之前自动删除杂散的 unix-socket 文件?

是否有一种安全的方法可以在运行相关服务之前自动删除杂散的 unix-socket 文件?

我在 Ubuntu 18.04 上的主管运行 Daphne,并选择--unix-socket绑定到 Unix 套接字而不是 TCP 主机/端口:

command=daphne --unix-socket /home/project/run/daphne.sock project.asgi:application

断电后,文件实例daphne.sock残留,重启后 Daphne 拒绝启动,直到我手动删除有问题的文件。

有没有办法在运行主管之前在系统启动时安全地删除该文件?

我理解这不是 Daphne 特有的问题,并且会影响 PostgreSQL 等其他组件,因此,任何适合在由 Supervisor 或 systemd 启动服务之前清理文件的建议都将非常感激

答案1

使用tmpfs,例如在里面创建文件/dev/shm

它旨在显示为已安装的文件系统,但存储在易失性存储器而不是持久存储设备。

[重点是我的]

在我的 Debian 中/run也是如此tmpfs,我可以看到很少有工具在那里创建了它们的套接字。根据跳频 /run是系统范围服务创建的套接字的好地方。

运行时变量数据:自上次启动以来运行系统的信息,例如当前登录的用户和正在运行的守护进程。此目录下的文件必须在启动过程开始时删除或截断;但在将此目录作为临时文件系统 (tmpfs) 提供的系统上,这不是必需的。

在我的 Debian 中/run属于 root,其模式位(权限)为rwxr-xr-x。普通用户无法从中受益。

另一方面/dev/shmrwxrwxrwt任何人都可以使用它。但由于它是“公共土地”(如/tmp),因此很少出现问题。名称冲突的可能性就是其中之一。即使两个用户的意图完全无害,他们也可能会互相干扰。

然后是/run/user/$uid,也作为tmpfs

用于存储该用户正在运行的进程所使用的文件。[…]
此目录是系统本地的,只有目标用户可以访问。因此,希望在本地存储文件的应用程序不再需要担心访问控制。

相关内容