#!/bin/sh
. /lib/lsb/init-functions
log_daemon_msg "this is a daemon s message"
在 shell 控制台上,它打印,
this is a daemon s message
守护进程根本没有标准输出。那么为什么daemon startup
脚本要写入呢stdout
?他们不应该使用syslog
文件吗?如何将 init 日志重定向到系统日志文件,以便调试启动时间问题?我使用的是 Ubuntu 14.04。
答案1
守护进程根本没有标准输出。
不对。如果某个守护进程由 daemontools 系列工具集之一管理(https://unix.stackexchange.com/a/179798/5132),那么守护进程将继承一个开放的标准输出文件描述符,用于将其连接到日志记录服务的管道。如果使用 systemd,那么(在默认配置中)守护进程将继承一个开放标准输出文件描述符,用于将其连接到 systemd 日志服务的套接字。
无论如何,您都在混淆init.d
脚本,其中管理守护进程,以及守护进程本身。对于 System Vrc
和 systemd,init.d
脚本仅导致守护进程本身的启动和停止。 (在 System Vrc
情况下,它使用诸如 之类的帮助程序来完成此操作start-stop-daemon
。在 systemd 情况下,它用于systemctl
通过 D-Bus RPC 发送命令来处理#1。)它不是守护进程本身。
守护进程的标准输出不一定与init.d
脚本的标准输出有任何关系。您正在使用的是后者的标准输出log_daemon_msg
。此 shell 函数及其相关函数打印友好消息来自守护进程管理脚本,显示管理脚本在尝试执行守护进程控制命令时正在执行的操作。它们没有被使用在守护进程本身。
讽刺的是,由于守护进程管理的方式与 systemd 不同,因此所有log_daemon_msg
命令都变得无关紧要,因为任何源管理脚本/lib/lsb/init-functions
最终都会将所有控制命令转移到systemctl
.
如何将 init 日志重定向到系统日志文件,以便调试启动时间问题?
你有一个任务。您已经确定该任务的子任务可以通过某种方式解决log_daemon_msg
,并且在这里您询问如何去做log_daemon_msg
一些它不是设计要做的事情。专注于你的真实的问题。
Ubuntu 14.04使用upstart。它有一个新贵作业,通过在运行级别事件发生时实际运行 System V/etc/init/rc.conf
来提供与 System V 的向后兼容性。这个工作是rc
rc
列于新贵食谱正如你所看到的用途诗console output
节。
正如你可以看到食谱,以及 upstart — 守护进程(默认情况下)继承一个开放的标准输出文件描述符,该描述符连接到 upstart 的每作业日志记录机制。再一次,守护进程“没有标准输出”的观念是错误的。该/etc/init/rc.conf
作业使用(非默认)选项将标准输出连接到控制台。当然,这也会重定向 System V 生成的各种守护进程管理脚本的输出rc
。
因此,如果您想在其他地方记录作业的输出/etc/init/rc.conf
以及它生成的所有 System V 管理脚本,请修改该作业规范。
如果您想调试启动时问题,请使用以下机制中描述的新贵食谱(以及 AskUbuntu Stack Exchange 上的几个答案)用于启动时调试。
进一步阅读
- 运行级别。 Ubuntu 14.04 手册页。典范。
- 启动Ubuntu 14.04 手册页。典范。
- https://askubuntu.com/questions/36200/
- https://askubuntu.com/questions/116407/
- https://superuser.com/questions/403847/