我有一个 RHEL 8 工作站,其中托管一个应用程序,其 GUI 可通过 https 访问。
当应用程序启动时,它会创建一些/tmp
具有随机名称和.sock
后缀的套接字文件:
$ ls -l /tmp/*.sock
srwx------ 1 app app 0 Dec 21 13:30 /tmp/supervisor-358513b0f6222d2339e4ab66d30b0037.sock
srwx------ 1 app app 0 Dec 21 13:31 /tmp/mongodb-358513b0f6222d2339e4ab66d30b0037.sock
srwx------ 1 app app 0 Dec 21 13:31 /tmp/livegui-358513b0f6222d2339e4ab66d30b0037.sock
$ file /tmp/*.sock
/tmp/supervisor-358513b0f6222d2339e4ab66d30b0037.sock: socket
/tmp/mongodb-358513b0f6222d2339e4ab66d30b0037.sock: socket
/tmp/livegui-358513b0f6222d2339e4ab66d30b0037.sock: socket
更新:套接字文件名的“随机”部分实际上是应用程序安装路径的 MD5。
当人们频繁使用该应用程序时,该应用程序可以正常运行数周/数月,但是当几天内无人连接到该应用程序时,它就会停止响应;当这种情况发生时,我可以看到文件.sock
在应用程序进程仍在运行时被删除......
有没有什么办法可以防止删除某些文件/tmp
?
是的,请参阅
man 5 tmpfiles.d
:然后创建一个配置文件,例如/etc/tmpfiles.d/myappsocket.conf
其内容如下:这样,临时文件管理器进程就不会再删除您的应用程序套接字。
对于应用程序来说,首选的解决方案是将套接字放在 下
/run
,因为这类事物的标准(请注意 3.15.2 节的最后一行)规定应该这样放置(因为它们不是临时数据,并且因为除了重新启动之外,没有一个正常的系统会清除 中的旧文件/run
)。最不受欢迎但仍然可行的解决方案是添加systemd-tmpfiles
/etc/tmpfiles.d
的例外以将文件排除在清理之外,正如 telcoM 的答案所建议的那样。/run/tmpfiles.d
除了这两个选项之外,还有一种更为复杂的方法是让应用程序本身在知道路径是什么之后在文件中写出特定套接字路径的覆盖。尽管如此,无论怎样,这都是一个应该报告给应用程序开发人员(也可能是 systemd 开发人员,因为 systemd-tmpfiles 不应该删除监听套接字,虽然我不确定它什么时候开始避免这样做,所以这可能只是 RHEL 8 上 systemd 版本的结果)。
将它们放在 /var/run/user/UID/ 中
一种不需要提升权限的解决方法是
.sock
使用运行应用程序进程的用户的 crontab 定期更新文件的访问时间。/tmp/*.sock
每天凌晨 01:00更新文件访问时间的 crontab 条目示例: