私はスクリプトを書いてよく書くのを手伝ってくれますか?作業が終わってエラーが発生しないと、本当に詰まります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を設定すると、fCKA2
2番目のループがこれらの機能の後に実行されるため、最終的に問題が発生します。
たとえば、元の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 = ''設定を完全に削除してみてください。あなたにも効果があるかもしれません!