我在遠端 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"
沒有引號,一切都很好。