제가 대본을 작성하고 잘 쓸 수 있도록 도와주실 수 있나요? 작업이 끝났고 오류가 발생하지 않으면 정말 막히게 됩니다 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 ...)
따라서 당신이 보고 있는 문제는 단일 여러 줄 문자열에 전체 파일 목록을 포함하는 하나의 항목을 가져오는 것이 아니라 한 번에 하나의 파일을 볼 것으로 예상하는 파일을 실행하고 있다는 것입니다 .
이는 IFS=' '
함수에 대한 할당으로 인해 발생합니다. 그들은 공간을 다음과 같이 설정했습니다.오직구분 기호는 개행 문자가 더 이상 한 줄로 간주되지 않음을 의미합니다(그리고 ls
여러 줄로 나누어야 함).
fCKA1
및 내부에 IFS를 설정하면 fCKA2
두 번째 루프가 이러한 기능 이후에 실행되기 때문에 결국 문제가 발생하게 됩니다.
예를 들어, 원래 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
}
또 하나의 질문은 IFS를 설정해야 하느냐는 것입니다. 기본값은 공백으로 분할됩니다. 모든 공백은 공백으로 분할해야 합니까? IFS=' ' 설정을 완전히 제거해 보십시오. 귀하에게도 효과가 있을 수 있습니다!