如果程序从 init.d 启动,系统日志将无法工作

如果程序从 init.d 启动,系统日志将无法工作

我有一个程序需要在启动时运行。如果我从终端 /etc/init.d/Program_B.sh 运行脚本,系统日志工作正常。但是,即使该程序正在运行,它也不会在启动时登录到系统日志。我使用 init.d 脚本是因为我系统中的虚拟机没有 systemctl。该程序正在运行,我可以看到该进程。

ps -aux | grep Program_B                      
root      1905  0.0  0.2   2308   868 ?        S    09:13   0:00 
/usr/bin/Program_B

我的设置如下:

/usr/bin/Program_B
/etc/init.d/Program_B.sh

其中 Program_B.sh 是:

#!/bin/bash
/usr/bin/Program_B

创建初始化文件并复制我运行的可执行文件后

sudo update-rc.d Program_A.sh defaults

在我的 /etc/syslog-ng/syslog-ng.conf 中,我设置了以下几行:

source s_src { unix-dgram("/dev/log"); internal();
                    file("/proc/kmsg" program_override("kernel"));
};
...
template t_timestamp {
    template("${R_DATE} ${MSGHDR}${MSG}\n");
};
...
destination d_local2 { file("/var/log/Progam_B.log" template(t_timestamp) create-dirs(yes)); };
...
filter f_local2 { program("Program_B");};
log { source(s_src); filter(f_local2); destination(d_local2); };

从 init.d 运行时什么可能会破坏系统日志?

答案1

这是启动顺序的问题,因为 Program_A 在 syslog 进程之前启动,因此无法使用该服务。解决方案是运行此脚本:

 sudo update-rc.d Program_A.sh start 21 2 3 4 5 . stop 21 0 1 6 .

代替

 sudo update-rc.d Program_A.sh defaults

update-rc.d 在存储在文件夹 /etc/rc?.d 中的不同运行级别创建符号链接。理论上,将 LSBInit 标头添加到 Program_A.sh 中应该会自动解析启动顺序。然而,对于我的嵌入式系统来说,情况并非如此。

Syslog 的“启动编号”为 20,因此将我的 Program_A 设置为高于该启动顺序将确保 Program_A 在 syslog 之后启动。

相关内容