Syslog
如果程序從 init.d 啟動,則 Syslog 不起作用
我有一個需要在啟動時執行的程序。如果我從終端 /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 之後啟動。