完了後、スクリプトが壊れました。

完了後、スクリプトが壊れました。

私はスクリプトを書いてよく書くのを手伝ってくれますか?作業が終わってエラーが発生しないと、本当に詰まりますset -x。ただ…何と呼ぶべきか分からない。私はbashシェルスクリプトが初めてです。したがって、私のスクリプトのいくつかを提供します...

#!/bin/bash
export PATH=$PATH
set -x
Years=$(date +"%Y")
Months=$(date +"%m")
Days=$(date +"%d")

MAINS=/home/usr_engineer/url_prj

CKA=/data/disks1/url_log/
JT2=/data/disks2/url_log/
BKS=/data/disks3/url_log/
SLP=/data/disks4/url_log/
KBB=/data/disks5/url_log/
BOO=/data/disks6/url_log/
GBL=/data/disks7/url_log/
HDFS=/data/landing/mrs/url_log

kinit -kt /home/usr_engineer/usr_engineer.keytab usr_engineer

fCKA1() {
    hadoop fs -put $i $HDFS/cka-np1p/$Years/$Months
    sleep 1
    IFS=' '
    while read names rows sizes; do
        echo '`[CKA]`' > $MAINS/logs/cka1
        echo $names >> $MAINS/logs/cka1
        echo $rows | sed ':a;s/\B[0-9]\{3\}\>/.&/;ta' >> $MAINS/logs/cka1
        echo $(awk 'BEGIN {printf "%.2f GB\n",'$sizes'/1073741824}') >> $MAINS/logs/cka1
    done < $i.ctrl
    echo "[Hadoop Metadata]" >> $MAINS/logs/cka1
    Sizes_Tele=$(hadoop fs -ls $HDFS/cka-np1p/$Years/$Months/$i | awk '{print $5}')
    Sizes_Telec=$(awk 'BEGIN {printf "%.2f GB\n",'$Sizes_Tele'/1073741824}')
    echo "$i ($Sizes_Telec)" >> $MAINS/logs/cka1
    cat $MAINS/logs/cka1 | telegram-send --stdin --format markdown
    rm -rf $i $i.ctrl
}

fCKA2() {
    hadoop fs -put $i $HDFS/cka-np2p/$Years/$Months
    sleep 1
    IFS=' '
    while read names rows sizes; do
        echo '`[CKA]`' > $MAINS/logs/cka2
        echo $names >> $MAINS/logs/cka2
        echo $rows | sed ':a;s/\B[0-9]\{3\}\>/.&/;ta' >> $MAINS/logs/cka2
        echo $(awk 'BEGIN {printf "%.2f GB\n",'$sizes'/1073741824}') >> $MAINS/logs/cka2
    done < $i.ctrl
    echo "[Hadoop Metadata]" >> $MAINS/logs/cka2
    Sizes_Tele=$(hadoop fs -ls $HDFS/cka-np2p/$Years/$Months/$i | awk '{print $5}')
    Sizes_Telec=$(awk 'BEGIN {printf "%.2f GB\n",'$Sizes_Tele'/1073741824}')
    echo "$i ($Sizes_Telec)" >> $MAINS/logs/cka2
    cat $MAINS/logs/cka2 | telegram-send --stdin --format markdown
    rm -rf $i $i.ctrl
}

fJT21() {
    hadoop fs -put $i $HDFS/jt2-np1p/$Years/$Months
    sleep 1
    IFS=' '
    while read names rows sizes; do
        echo '`[JT2]`' > $MAINS/logs/jt21
        echo $names >> $MAINS/logs/jt21
        echo $rows | sed ':a;s/\B[0-9]\{3\}\>/.&/;ta' >> $MAINS/logs/jt21
        echo $(awk 'BEGIN {printf "%.2f GB\n",'$sizes'/1073741824}') >> $MAINS/logs/jt21
    done < $i.ctrl
    echo "[Hadoop Metadata]" >> $MAINS/logs/jt21
    Sizes_Tele=$(hadoop fs -ls $HDFS/jt2-np1p/$Years/$Months/$i | awk '{print $5}')
    Sizes_Telec=$(awk 'BEGIN {printf "%.2f GB\n",'$Sizes_Tele'/1073741824}')
    echo "$i ($Sizes_Telec)" >> $MAINS/logs/jt21
    cat $MAINS/logs/jt21 | telegram-send --stdin --format markdown
    rm -rf $i $i.ctrl
}

fJT22() {
    hadoop fs -put $i $HDFS/jt2-np2p/$Years/$Months
    sleep 1
    IFS=' '
    while read names rows sizes; do
        echo '`[JT2]`' > $MAINS/logs/jt22
        echo $names >> $MAINS/logs/jt22
        echo $rows | sed ':a;s/\B[0-9]\{3\}\>/.&/;ta' >> $MAINS/logs/jt22
        echo $(awk 'BEGIN {printf "%.2f GB\n",'$sizes'/1073741824}') >> $MAINS/logs/jt22
    done < $i.ctrl
    echo "[Hadoop Metadata]" >> $MAINS/logs/jt22
    Sizes_Tele=$(hadoop fs -ls $HDFS/jt2-np2p/$Years/$Months/$i | awk '{print $5}')
    Sizes_Telec=$(awk 'BEGIN {printf "%.2f GB\n",'$Sizes_Tele'/1073741824}')
    echo "$i ($Sizes_Telec)" >> $MAINS/logs/jt22
    cat $MAINS/logs/jt22 | telegram-send --stdin --format markdown
    rm -rf $i $i.ctrl
}

sleep 2
cd $CKA
sleep 2
for i in $(ls -lh $CKA | grep -v .ctrl | grep url | awk '{print $9}');do
    echo $i | grep cka-np1p
    if [ $? -eq 0 ]; then
        fCKA1
    else
        echo $i | grep cka-np2p
        if [ $? -eq 0 ]; then
            fCKA2
        fi
    fi
done

sleep 2
cd $JT2
sleep 2
for i in $(ls -lh $JT2 | grep -v .ctrl | grep url | awk '{print $9}');do
    echo $i | grep jt2-np1p
    if [ $? -eq 0 ]; then
        fJT21
    else
        echo $i | grep jt2-np2p
        if [ $? -eq 0 ]; then
            fJT22
        fi
    fi
done

このコマンドを使用して、ログを保存するスクリプトを保存して実行します。

nohup bash name.sh > name.log 2>&1 &

結果はこちらhttps://pastebin.com/12yhttgG

sleep追加もして、変更もしてみましたがfor, grep models …スクリプトを分離してcka.sh, jt2.sh同時に実行するとスクリプトが壊れませんでした。 Pastebinリンクが表示されると、行181でエラーが発生します。その行の後には、hadoop次のコマンドを実行する必要があります。

世界に…この作業をするのに6時間かかりました…助けてください…チームビューアやこの問題を解決できるものがあれば大歓迎です。

ベストアンサー1

for i in $(ls ...)したがって、あなたが見ている問題は、単一の複数行文字列にファイルの完全なリストを含む1つのアイテムを取得するのではなく、一度に1つのファイルを見ることを期待するファイルを実行していることです。

これは、IFS=' '関数への割り当てが原因で発生します。彼らはスペースを次のように設定しました。ただ区切り文字は、改行文字がもはや1行と見なされないことを意味します(そして複数ls行に分割する必要があります)。

fCKA1そして内部にIFSを設定すると、fCKA22番目のループがこれらの機能の後に実行されるため、最終的に問題が発生します。

たとえば、元のIFSを設定する前に保存し、機能が完了したら復元してこの問題を解決できます。

たとえば、

fCKA1() {
    hadoop fs -put $i $HDFS/cka-np1p/$Years/$Months
    sleep 1
    save_IFS=$IFS
    IFS=' '
    while read names rows sizes; do
        ...
    rm -rf $i $i.ctrl
    IFS=$save_IFS
}

たぶん、次のように「読み取り」コマンドで設定できます。

IFS=' ' read names rows sizes

機能の文脈で得られるものは次のとおりです。

fCKA1() {
    hadoop fs -put $i $HDFS/cka-np1p/$Years/$Months
    sleep 1
    while IFS=' ' read names rows sizes; do
        ...
    rm -rf $i $i.ctrl
}

もう1つの質問は、IFSを設定する必要があるかどうかです。デフォルト値はスペースに分割されます。すべてのスペースをスペースに分割する必要がありますか? IFS = ''設定を完全に削除してみてください。あなたにも効果があるかもしれません!

おすすめ記事