Debian系统上基于文件的套接字的惯用位置


13

我正在C使用Unix Domain Socket为Debian系统编写一个守护进程。

如果守护进程的工作目录是根目录,是否存在惯用目录将套接字放置在文件系统上?


您为什么不让它可配置?
BatchyX 2013年

3
@BatchyX好吧,某种默认值(而不是强迫每个管理员完全自己做出决定)可以很好。:)
CVn

Answers:


17

它们通常位于/tmp或其子目录中。请注意,/tmp关闭时,其中的所有内容都会被擦除-不一定要删除它,只是要注意它可以被删除,因此,如果使用它,请检查是否每次都必须创建子目录。如果您想通过权限限制访问,则将使用子目录,因为它/tmp是世界可读的。

/run/var/run(可能被符号链接在一起)以类似的方式使用,但是它们通常作为tmpfs文件系统挂载-意味着它们是在启动时创建的,并驻留在内存中,而不是在磁盘上(因此,请勿将其用作转储的地方)大量的数据)。对于运行时套接字,这可能是一个不错的选择。

请注意/run,以及此处提到的所有其他目录(除外 /tmp)只能由root用户写入。对于系统进程,这很好,但是如果应用程序可以由非特权用户运行,则您要使用/tmp或在某个位置创建永久目录并对其设置权限,或者使用该用户的$ HOME中的位置。

在安装过程中可以在/usr/share(或/usr/local/share)中创建目录。目录和内容在靴子中可能不会像在/tmp或中那样获得/run。但是,正如jordanm在评论中指出的那样,它/usr可能是只读挂载的,并且linux文件系统层次结构准则反映了这一点。当然,安装应用程序后,它不能是只读的,因此,如果您愿意在那里创建套接字,则可以将其保留并稍后使用(即使文件为只读)。

如果您希望跨靴子的某个地方持久存在而不会以只读方式挂载,那/etc是一个相当安全的选择,因为这通常用于系统范围的配置和重新配置。OTOH,可能会有这样的系统,其中整个根文件系统下面的设备是只读的(例如,嵌入式系统),而/ tmp和/ run可以在另一个设备上运行(可能是:内存中的tmpfs)。因此,两个最可靠的策略似乎是:

  • 安装应用程序后,将套接字安装到永久位置。

  • 在运行时/run/var/run运行时创建目录,然后将套接字放在此处。

  • 仅在中执行相同的操作/tmp

第一个优点是,无论如何,一旦安装了应用程序,便可以使用套接字。第二个优点是它可能更有利于合理编程。第三个优点是不需要超级用户特权。如果以后改变主意,从一种实现切换到另一种实现应该很容易。

最后,在启动BatchyX时,您至少应为此提供一个配置选项,而不必选择默认值。


2
/run/var/run也经常用于根进程。
BatchyX 2013年

对。那些甚至比/tmp。我将对其进行编辑
。– goldilocks

/usr可以挂载为只读。永远不要在运行时在此处创建文件。其他建议是好的。
jordanm

1
谢谢大家的投入,讨论非常有益。我决定设置默认位置,/tmp/.APPNAME/.APPSOCK因为守护程序不需要持久性数据。
recursion.ninja

1
/tmp和之间的另一个关键区别/run是,只有root拥有对的写入权限/run
BatchyX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.