我应该如何从非 root Debian Linux 守护进程登录?

Posted

技术标签:

【中文标题】我应该如何从非 root Debian Linux 守护进程登录?【英文标题】:How should I log from a non-root Debian Linux daemon? 【发布时间】:2010-10-03 18:48:11 【问题描述】:

我正在编写一个新的守护进程,它将托管在 Debian Linux 上。

我发现 /var/log 只有 root 写权限,所以我的守护进程不能在那里写日志文件。

但是,如果它在那里写入,它似乎将获得自动日志轮换,并且还可以按照用户的预期工作。

对于守护程序写入出现在 /var/log 中的日志条目而不必以 root 身份运行的推荐方法是什么?

守护进程是一个网络服务器,因此日志流量将类似于 Apache。

【问题讨论】:

【参考方案1】:

以 root 身份在此处创建一个日志文件并将文件所有者更改为网络服务器用户:

# touch /var/log/myserver.log
# chown wwwuser /var/log/myserver.log

如果以用户wwwuser 运行,则服务器可以写入文件。但是,它不会获得自动日志轮换。您必须将日志文件添加到/etc/logrotate.conf/etc/logrotate.d/... 并让您的服务器在logrotate 发出信号时重新打开日志文件。

您也可以使用syslog 进行日志记录,如果这更适合您的场景。

【讨论】:

最好将日志放在 WiseTechi 的回答中提到的子目录中。如果您在 /var/log 中有该文件并且该文件被删除,则非 root 进程将无法重新创建该文件 此外,守护进程也无法进行日志轮换,因为它没有在 logdir 中创建新文件的权限。 通常守护进程不必重新创建文件,但 logrotated 重命名现有日志并创建具有正确权限的新日志文件。然后它告诉恶魔使用新文件,因为它已经拥有正确的权限。【参考方案2】:

使用“记录器”命令

http://linux.die.net/man/1/logger

【讨论】:

logger 与任何其他程序一样受到相同的权限限制。在使用记录器之前,您仍然需要修复这些问题。 @pavon 这似乎不正确,至少对于 Ubuntu 18.04。 echo "test" > /var/log/my_log 会失败,但logger "test" 会成功。【参考方案3】:

两种选择:

    root 开头,打开文件,然后使用setuid 删除权限。 (我不记得删除权限的确切系统调用。)如果你想绑定到 TCP 端口 80 或低于 1024 的任何端口,无论如何你都必须这样做。 创建一个子目录,如 /var/log/mydaemon,拥有守护进程的用户所有权,如 WiseTechi said。

/var/log 下的文件不会自动旋转;相反,旋转由/etc/logrotate.conf/etc/logrotate.d 下的文件控制。

【讨论】:

【参考方案4】:

您应该创建一个像 /var/log/mydaemon 这样的子目录,拥有守护进程的用户所有权

【讨论】:

给 /var/log/mydaemon 写权限而不是 chown 怎么样? 绝对可行,但您必须依靠一个共同的小组来实现这一目标,因此它比仅仅设置适当的所有权更复杂。

以上是关于我应该如何从非 root Debian Linux 守护进程登录?的主要内容,如果未能解决你的问题,请参考以下文章

请教在debian linux 下如何挂载一个ISO文件?

如何在 Debian 上以非 root 用户身份运行 Spring Boot 应用程序?

debian linux

Debian和Ubuntu Linux下如何以root身份登录图形界面

从非 root 用户执行 root 所需的脚本

如何从非域注册的 Linux 机器使用 SQuirreL SQL 连接到 SQL Server?