我在共享内存段中使用一个简单的pthreads进程共享互斥锁来协调多个服务器实例。
代码很简单:
在启动服务器上,如果存在则附加到共享内存段,或者如果不存在则创建它:
shm_open()
,mmap(MAP_SHARED)
等。
这在测试时非常有效,但是一段时间后我就遇到了服务器实例根本没有协调的情况。我可以通过在服务器启动后删除共享内存段来复制这个:未来的服务器实例将创建/使用一个新的段但是现有的一个段卡住了没有人使用的旧段,所以实际上它与其余段隔离了...... / p>
所以我的猜测是/ dev / shm中的共享内存段以某种方式被删除,而不是我。这是唯一有意义的事情......这里发生了什么?
使用linux 4.9运行debian。
答案 0 :(得分:3)
啊,看起来像systemd是罪魁祸首:
经过几个小时的搜索和阅读,我找到了罪魁祸首。这是systemd的设置。
/etc/systemd/logind.conf
包含默认配置选项,每个选项都已注释掉。默认情况下,RemoveIPC
选项设置为yes。该选项告诉systemd清理未登录的“用户帐户”的进程间通信(IPC)。这不会影响“系统帐户”就我而言,正在为用户帐户而不是系统帐户创建文件和目录。
有两种可能的解决方案:
- 使用/为系统用户创建文件 - 使用系统选项(
adduser -r
或adduser --system
创建的用户)- 修改
醇>/etc/systemd/logind.conf
,取消注释第RemoveIPC=yes
行,将其更改为RemoveIPC=no
,保存并重启系统在我的情况下,我使用选项#2,因为用户已经创建。
另请参阅postgresql邮件列表中的this post。