首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本在完成后中断

脚本在完成后中断
EN

Unix & Linux用户
提问于 2018-03-22 06:52:47
回答 1查看 46关注 0票数 -3

你能帮我做好脚本和好脚本吗?我受够了,我真的被困在.当我set -x时没有错误。只是..。我不知道这叫什么。我是脚本编写bash shell的新手。所以让我提供一些我的剧本..。

代码语言:javascript
复制
#!/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

我使用以下命令保存并运行该脚本以保存日志

代码语言:javascript
复制
nohup bash name.sh > name.log 2>&1 &

这里的结果是https://pastebin.com/12yhttgG

我增加了sleep,改变了for, grep models,但是.如果我分离该脚本(如cka.sh, jt2.sh )并在同一时间运行这些脚本,脚本就不会被破坏。如果您看到pastebin链接,错误将从第181行开始。在这一行之后,它应该运行hadoop命令:'(

天哪..。我为此花了6个小时..。请帮帮我..。teamviewer或任何解决这个非常受欢迎的问题的方法

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-03-22 07:27:50

因此,您所看到的问题似乎是,您正在运行一个for i in $(ls ...),期望一次只看到一个文件,而只是在一个多行字符串中得到一个包含整个文件列表的条目。

这是由函数中的IFS=' '分配造成的。它们将空间设置为分隔符,这意味着换行符不再被认为是行( ls需要将其拆分为多行)。

当您在fCKA1fCKA2中设置IFS时,您最终会在第二个循环中看到问题,因为它会在这些函数之后运行。

例如,您可以通过在设置原始IFS之前保存它并在函数结束时恢复它来解决这个问题。

例如:

代码语言:javascript
复制
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
}

也许更好的方法是,只为"read“命令设置它,如下所示:

代码语言:javascript
复制
IFS=' ' read names rows sizes

在您的函数的上下文中,您得到的是:

代码语言:javascript
复制
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=‘’设置,它可能对您同样有效!

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/432745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档