你能帮我做好脚本和好脚本吗?我受够了,我真的被困在.当我set -x时没有错误。只是..。我不知道这叫什么。我是脚本编写bash shell的新手。所以让我提供一些我的剧本..。
#!/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个小时..。请帮帮我..。teamviewer或任何解决这个非常受欢迎的问题的方法
发布于 2018-03-22 07:27:50
因此,您所看到的问题似乎是,您正在运行一个for i in $(ls ...),期望一次只看到一个文件,而只是在一个多行字符串中得到一个包含整个文件列表的条目。
这是由函数中的IFS=' '分配造成的。它们将空间设置为仅分隔符,这意味着换行符不再被认为是行( ls需要将其拆分为多行)。
当您在fCKA1和fCKA2中设置IFS时,您最终会在第二个循环中看到问题,因为它会在这些函数之后运行。
例如,您可以通过在设置原始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
}也许更好的方法是,只为"read“命令设置它,如下所示:
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=‘’设置,它可能对您同样有效!
https://unix.stackexchange.com/questions/432745
复制相似问题