Syslog

如果程序從 init.d 啟動,則 Syslog 不起作用

  • June 21, 2019

我有一個需要在啟動時執行的程序。如果我從終端 /etc/init.d/Program_B.sh 執行腳本,系統日誌工作正常。但是,即使程序正在執行,程序也不會在啟動時登錄到 syslog。我正在使用 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 執行時,什麼可能會破壞系統日誌?

這是引導順序的問題,因為 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 之後啟動。

引用自:https://unix.stackexchange.com/questions/526034