プログラムがinit.dで起動すると、Syslogは機能しません。

プログラムがinit.dで起動すると、Syslogは機能しません。

起動時に実行する必要があるプログラムがあります。端末で /etc/init.d/Program_B.sh スクリプトを実行すると、syslog が正常に動作します。ただし、プログラムが実行されていても起動時にシステムログに書き込まれません。私のシステムの仮想マシンにsystemctlがないので、init.dスクリプトを使用します。プログラムが実行中で、そのプロセスを見ることができます。

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で実行するとsyslogが破損する可能性は何ですか?

答え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 フォルダに保存されているさまざまな実行レベルでシンボリックリンクを生成します。理論的には、Program_A.shにLSBInitヘッダーを追加すると、起動順序が自動的に解決されます。しかし、私の組み込みシステムではそうではありません。

Syslogの「開始番号」は20なので、Program_Aをこれより高く設定すると、Program_Aはsyslogの後に始まります。

関連情報