승인 전 코어 덤프 연결 [닫기]

승인 전 코어 덤프 연결 [닫기]

원격 Ubuntu 시스템에서 내 애플리케이션에 대한 코어 덤프 빌드를 연결하고 있습니다.

내 coredumper bash 스크립트에 /proc/sys/kernel/core_pattern 경로를 추가하여 이 작업을 수행했습니다.

"|/some/.../path/my_coredump_collector.sh  %P %p %s %c %d %e %E %t %g %h %i %I %u"

스크립트는 코어 덤프를 파일에 기록하고 결과 정보 파일과 함께 이를 tar.gz 아카이브로 패키징한 다음 scp를 사용하여 원격 시스템으로 보냅니다.

스크립트는 내 애플리케이션에서만 작동해야 하며 다른 애플리케이션에 대해서는 기본 코어 덤프 핸들러를 호출해야 합니다.

이를 달성하기 위해 /proc/sys/kernel/core_pattern의 이전 내용을 모든 플래그와 함께 변수에 저장합니다. 이 특정 시스템의 경우 기본 핸들러는 다음과 같습니다.

"|/usr/share/apport/apport %p %s %c %d %P"

sed를 사용하여 명령줄 변수를 대체합니다.% 기호주어진 변수의 실제 값으로.

마지막으로 기본 핸들러를 호출하여 교체하고 코어 덤프 파일 내용을 해당 핸들러로 파이프합니다.

그러나 apport는 이런 식으로 작동하고 싶지 않은 것 같습니다. 내가 뭘 잘못하고 있는지 이해가 안 돼요. 유효한 매개변수와 코어 덤프 입력을 제공했습니다.

내 티켓은 다음과 같습니다.

#!/bin/sh

PREV_COMMAND="|/usr/share/apport/apport %p %s %c %d %P"
WORK_DIR="/path/to/my/script/file"
DESTINATION="username@hostname:/path/to/store/core/dumps"
SSH_KEY="/path/to/ssh/key"

COREDIR_NAME="$6.$1.$8.core"
TIMESTAMP=$(date --date="@$8")

COREDIR="$WORK_DIR/$COREDIR_NAME"

INFOHEADER_FILE="$COREDIR/core.info"
COREFILE="$COREDIR/core.dump"

###############################
## 1 P
## 2 p
## 3 s
## 4 c
## 5 d
## 6 e
## 7 E
## 8 t
## 9 g
## 10 h
## 11 i
## 12 I
## 13 u
###############################

PREV_COMMAND=$(echo $PREV_COMMAND | sed 's/|//g')
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%P/$1/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%p/$2/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%s/$3/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%c/$4/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%d/$5/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%e/$6/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%E/$7/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%t/$8/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%g/$9/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%h/$10/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%i/$11/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%I/$12/g")
PREV_COMMAND=$(echo $PREV_COMMAND | sed "s/%u/$13/g")

if [ "$6" != "my_app1" -a "$6" != "my_app2" -a "$6" != "my_app3" ]
then
    cat | "$PREV_COMMAND" # don't work
    exit 0
fi

mkdir $COREDIR

echo "PID: $1" > $INFOHEADER_FILE
echo "pid: $2" >> $INFOHEADER_FILE
echo "SIGNALCODE: $3" >> $INFOHEADER_FILE
echo "DumpSize: $4" >> $INFOHEADER_FILE
echo "DumpMode: $5" >> $INFOHEADER_FILE
echo "Executable: $6" >> $INFOHEADER_FILE
echo "Path: $(echo $7 | sed 's/!/\//g')" >> $INFOHEADER_FILE
echo "Date: $TIMESTAMP" >> $INFOHEADER_FILE
echo "GID: $9" >> $INFOHEADER_FILE
echo "Hostname: $10" >> $INFOHEADER_FILE
echo "tid: $11" >> $INFOHEADER_FILE
echo "TID: $12" >> $INFOHEADER_FILE
echo "UID: $13" >> $INFOHEADER_FILE

cat > ${COREFILE}

cd $WORK_DIR
tar -zcf $COREDIR.tar.gz $COREDIR_NAME
cd -

#rsync -av -e "ssh -i $SSH_KEY" $COREDIR.tar.gz $DESTINATION &> $WORK_DIR/rsync.log # rsync don't want work here :(
scp -i $SSH_KEY $COREDIR.tar.gz $DESTINATION

cat ${COREFILE} | "$PREV_COMMAND" # don't work too.

rm -rf $COREDIR.tar.gz $COREDIR

내 목적을 달성하기 위해 apport에서 생성된 코어 덤프를 사용하고 싶지 않습니다. 이상적으로 이 스크립트는 /proc/sys/kernel/core_pattern 및 기본 코어 덤프 처리기를 지원하는 모든 시스템에서 실행되어야 합니다.

답변1

문제는 여기 인용문에 있습니다.

cat | "$PREV_COMMAND"

따옴표가 없으면 모든 것이 괜찮습니다.

관련 정보