我怎样才能删除权限,仍然清理我的PID文件在/ var / run?

我有一个名为foo守护进程。 我的init脚本/etc/init.d/foo启动foo守护进程,并将其pidfile存储在/var/run/foo.pid ,这似乎是标准的地方。 由于/etc/init.d/foo必须以root身份运行,因此在/var/run创build和删除pidfiles并不困难。

foo守护程序实际上是程序/usr/sbin/foo ,它打算以初始化脚本的root用户身份被调用,但是立即将其权限放到非特权的foo用户。 但是,我还希望这个/usr/sbin/foo程序在由于严重错误而退出时删除它的pid文件。 但是由于它已经放弃了它的特权,它不再有能力从/var/run目录中删除文件。

我目前的做法是使用seteuid而不是setuid来放弃我的权限,然后在退出之前立即重新提高权限,以便我可以正确地从/var/run删除pid文件。 然而,我遇到了各种各样的图书馆和外部程序遇到的许多问题,当用不同的euid而不是uid进行调用时,这些问题会变得无关紧要。

有没有其他办法可以做到这一点? 我想另外一个select是把我的pidfile放在一个可以被root和foo用户写入的目录中。 但是我们所有的其他pidfiles都在/var/run ,包括其他程序的pidfiles,这些程序以非特权用户的身份运行,所以我想把foo.pid文件放在那里。

除了使用seteuid还有什么办法可以做到吗?

不要把PID文件放在/var/run/foo.pid ,把它放在/var/run/foo/foo.pid ,让用户foo和组foo拥有/var/run/foo foo 。 这样,您可以在退出之前删除pid文件,而不必提高您的权限级别。

但是,请注意,这是一个不好的安全做法,因为允许你的无特权应用程序破解它的文件将会打开一个安全漏洞:想象你的应用程序被劫持(毕竟,如果不能预测应用程序可以攻击?) – 现在,攻击者更新pid文件,并在那里放置sshd的pid号码。 现在,当系统范围的脚本(以root身份运行)将尝试使用该pid文件停止应用程序时,它们将会closuressshd。 这只是一个例子,有更多的方式来滥用你的系统。 总而言之,应该删除特权之前创buildpid文件,并且应该由系统范围的脚本来清除pid文件。 – 德米特里·D·Khlebnikov

更好的办法是切换到像systemd或Upstart这样的不需要PID文件来pipe理服务的init系统。

在运行守护进程之前,您可以分叉一个新进程。 父进程保持特权用户root 。 subprocess将其权限下降到foo用户。 这个过程是真正的守护进程。

父进程在分派subprocess后将创buildPID文件,并在其subprocess结束时将其删除。

看一下我的Ubuntu系统,我看到一些已安装的软件已经创build了非root用户拥有的/ var / run下的目录,就像jcollie所build议的那样。

另一个select是使非root用户拥有的pid文件归零,而不是将其删除。