완료 후 스크립트가 깨졌습니다.

완료 후 스크립트가 깨졌습니다.

제가 대본을 작성하고 잘 쓸 수 있도록 도와주실 수 있나요? 작업이 끝났고 오류가 발생하지 않으면 정말 막히게 됩니다 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=' ' 설정을 완전히 제거해 보십시오. 귀하에게도 효과가 있을 수 있습니다!

관련 정보