C 如何为唯一的守护进程和多个用户释放Linux锁文件

C 如何为唯一的守护进程和多个用户释放Linux锁文件,c,linux,locking,daemon,flock,C,Linux,Locking,Daemon,Flock,我有一个deamon,一次只能运行一个实例。守护进程是大型应用程序的一部分。我是这样做的: open()。权限实际上变成了0664,可能是因为umask(?) open()返回的文件描述符上的flock(),带有LOCK\u EX | LOCK\u NB 这就是我首先拥有的一切。我的守护进程在SIGTERM和SIGINT上退出,但结果表明在退出时锁没有释放。在man1flock(奇怪的是,在man2flock)的帮助下,我意识到,如果“封闭的命令组可能分叉了一个不应该持有锁的后台进程”,手动

我有一个deamon,一次只能运行一个实例。守护进程是大型应用程序的一部分。我是这样做的:

  • open()。权限实际上变成了0664,可能是因为umask(?)
  • open()
    返回的文件描述符上的
    flock()
    ,带有
    LOCK\u EX | LOCK\u NB
这就是我首先拥有的一切。我的守护进程在
SIGTERM
SIGINT
上退出,但结果表明在退出时锁没有释放。在
man1flock
(奇怪的是,在
man2flock
)的帮助下,我意识到,如果“封闭的命令组可能分叉了一个不应该持有锁的后台进程”,手动解锁可能是必要的。因为我正在处理一个守护进程,所以我现在在退出时手动解锁

现在我的问题是:有几个用户可能正在运行守护进程

如果user1正在运行守护进程,我希望user2能够杀死它并像自己一样重新启动它

锁定的文件
/tmp/prog.pid
具有权限0664、所有者user1、组user1

停止脚本
prog\u stop
会杀死应用程序中涉及的所有进程(它需要超级用户权限,我同意)。它还会杀死守护进程。当user2运行
prog\u stop
时,锁被释放(我相信),但user2无法启动自己的守护进程,因为它既不是锁文件的所有者,也不在其组中

几种可能的解决办法:

  • 将锁文件0666设为可写入所有用户。危险
  • 创建用户运行应用程序所需的组。这要求所有用户使用此组启动应用程序,可能需要借助
    newgrp
    。很容易忘记,不容易强制人们这么做。是否可能在用于启动应用程序的脚本中设置当前组
  • 完全删除
    prog\u stop
    中的锁定文件。缺点:我从C文件打开该文件,其中定义了路径字符串。我需要在停止脚本中使用path编写(并维护)完全相同的文件名

守护进程的锁定文件必须非常常见。处理此问题的标准方法是什么?

锁定文件的标准方法是将守护程序转换为服务,并要求
sudo
(或通过其他方式成为
root
)启动和停止它

现在,您可以为该文件指定一个组;然后,此组中的用户可以对其进行修改。他们可以使用
newgrp
,但最好使用
usermod--append--groups=foo bar
(将用户
bar
添加到组
foo
;用户保留其原始GID和所有其他组)。重新登录后,您可以使用
id栏
对此进行验证

这一切都很乏味。当我需要类似的东西时,我会创建一个套接字。套接字被创建它们的进程终止(因此无需清理)。套接字还可以用来与正在运行的守护进程通信(告诉我您的状态、关机、甚至重新启动等等)

我使用的是一个默认端口号,我将其编译到应用程序中,但我也使用一个环境变量来覆盖默认端口号


只需确保您创建了一个监听
localhost
的套接字;否则,Internet上的任何人都可以与它交谈。

我的意思是使用
newgrp
,不是将用户添加到新组(我使用
usermod-a-G
),而是将该组设置为当前组。默认情况下,如果创建文件,则该文件归组和组所有。用户必须将此特殊组设置为其当前组,以便创建的文件将其作为组。尝试
触摸asdf
ll asdf
,然后
newgrp tty
触摸qwer
ll qwer
。我会在守护进程中使用
chown(path,uid,gid)
为文件指定正确的组,或者首先使用正确的组运行守护进程。无需
newgrp