我正在为 Debian 系统编写一个守护进程,其中C
使用Unix 域套接字。
如果守护进程的工作目录是根目录,是否有一个惯用的目录将套接字放置在文件系统上?
答案1
它们通常位于/tmp
或其子目录中。请注意,关闭时所有内容/tmp
都会被擦除——并不是说它一定会被擦除,只是要注意它可,所以如果您使用它,请检查是否每次都必须创建子目录。如果您想通过权限限制访问,您将需要使用子目录,因为子目录/tmp
是世界可读的。
/run
和/var/run
(可能符号链接在一起)以类似的方式使用,但它们通常安装为 tmpfs 文件系统——这意味着它们是在启动时创建并驻留的在记忆中,不在磁盘上(所以不要将其用作转储大量数据的地方)。对于运行时套接字来说,这可能是一个不错的选择。
请注意/run
,以及此处提到的所有其他目录除了 /tmp
,只能由 root 写入。对于系统进程来说,这很好,但如果应用程序可能由非特权用户运行,您要么想要/tmp
在某处使用或创建一个永久目录并对其设置权限,要么使用用户 $HOME 中的位置。
安装期间可以在/usr/share
(或) 中创建目录。/usr/local/share
那里的目录和内容不可能像在/tmp
或中那样跨引导获得/run
。然而,作为约旦在评论中指出,/usr
可以以只读方式安装,并且Linux文件系统层次结构指导方针反映这一点。当然,当您的应用程序安装时,它不能是只读的,因此,如果您愿意在那里创建一个套接字,您可以保留它并稍后使用它(即使文件是只读的)。
如果您想要跨引导持久存在某个不会以只读方式安装的地方,/etc
这是一个相当安全的选择,因为这通常用于系统范围的配置和重新配置。 OTOH,可能存在整个根文件系统底层的设备是只读的系统(例如嵌入式系统),/tmp 和 /run 在另一个设备上(可能:内存中的 tmpfs)。因此,两个最稳健的策略似乎是:
安装应用程序时,将套接字安装到永久位置。
/run
在运行时或运行时创建一个目录/var/run
并将套接字放在那里。仅在 中做同样的事情
/tmp
。
第一个的优点是,无论如何,一旦安装了应用程序,您就将拥有一个可以使用的套接字。第二种的优点是可能更有利于理智的编程。第三种的优点是不需要超级用户权限。如果您以后改变主意,应该很容易从一种实现切换到另一种实现。
最后,作为巴奇X提出后,您至少应该为此提供一个配置选项,然后依靠您选择的默认值。