프로그램이 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 다음에 시작됩니다.

관련 정보