在批准之前连接核心转储

在批准之前连接核心转储

我在远程 Ubuntu 系统上为我的应用程序连接了 coredump 生成。

我通过将 /proc/sys/kernel/core_pattern 路径添加到我的 coredumper bash 脚本中来完成此操作。

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

该脚本将 coredump 写入文件,将其与生成的信息文件打包到 tar.gz 存档中,并使用 scp 将其发送到我的远程计算机。

脚本应该只适用于我的应用程序,并且应该为其他应用程序调用默认的核心转储处理程序。

为了实现这一点,我将 /proc/sys/kernel/core_pattern 的先前内容与变量中的所有标志一起存储。对于这个特定的系统,默认处理程序是 apport:

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

我用 sed 来替换命令行变量%象征与给定变量的实际值。

最后,我只需调用默认处理程序并进行替换,并将 coredump 文件内容通过管道传输到该处理程序中。

但似乎 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 生成的 coredump 来达到我的目的。在理想情况下,该脚本应该在任何支持 /proc/sys/kernel/core_pattern 和任何默认 coredump 处理程序的系统上运行。

答案1

问题出在这里的引号中:

cat | "$PREV_COMMAND"

没有引号,一切都很好。

相关内容