我正在 Ubuntu 服务器上开发一个由 Systemd 管理的守护进程应用程序。
我使用shm_open
在/dev/shm/中创建一个 SHM 文件,并在调用mmap
后close
文件描述符。一开始它存在,但一段时间后它消失了,也许是当我从服务器注销时。
也许这是由/etc/systemd/logind.conf 中RemoveIPC=yes
的选项控制的。
我的问题是
- 为什么systemd不清理Postgresql创建的shm文件,而是清理我的?
- 如何修改我的应用程序使其像Postgresql,以便我们可以减少生产时的管理/维护工作。
- 我发现 shm 内存在被 systemd 清理后仍然可用。这是否意味着我可以忽略它,并继续使用它而不重新创建?
我认为你的怀疑是对的;有关详细信息,请参阅文档:
如果正在使用 systemd,则必须注意不要过早地删除 IPC 资源(包括共享内存)。从源代码安装 PostgreSQL 时,这一点尤其值得关注。PostgreSQL分发包的用户不太可能受到影响,因为
postgres
用户通常被创建为系统用户。
logind.conf
中的设置RemoveIPC
控制在用户完全注销时是否删除 IPC 对象。系统用户除外。此设置在库存 systemd 中默认为 on,但某些操作系统发行版默认为 off。 [...]"用户注销"可能是维护作业的一部分,也可能在管理员以
postgres
用户身份登录时手动发生,因此通常很难防止。什么是"系统用户"是在 systemd 编译时根据
/etc/login.defs
中的SYS_UID_MAX
设置确定的。打包和部署脚本应小心地使用
useradd -r
、adduser --system
或等效项将postgres
用户创建为系统用户。或者,如果用户帐户创建不正确或无法更改,建议设置
RemoveIPC=no
/etc/systemd/logind.conf
或其他适当的配置文件中。
虽然这是在谈论PostgreSQL,但这同样适用于你的软件。因此,请采取推荐的措施之一。