首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果其他条件与远程服务器目录大小相同

如果其他条件与远程服务器目录大小相同
EN

Ask Ubuntu用户
提问于 2018-08-01 04:34:24
回答 2查看 829关注 0票数 2

我正在编写一个小脚本来将文件上传到远程ssh服务器,而在远程ssh服务器上,我将拥有几乎可用的2 TB of Space。

我需要在shell脚本中检查空间是否围绕着1.5 TB满,而不是sleep the script**start the script again**,一旦它返回到1TB

下面是代码的一部分,它需要运行检查目录大小的逻辑,然后将其放入if else statements中。

代码语言:javascript
复制
SIZE="$(ssh archiveupload@REMOTESERVER-IP "du -s")"
LIMIT="1.5TB"
if [ $SIZE -gt $LIMIT ];
then
  sleep 4h
elif
 continue ;
fi

更新脚本:

代码语言:javascript
复制
if [ ! -f /home/user/Tupload/upload-lock ]; then
    touch /home/user/Tupload/upload-lock
    ###Define the File in unix style#############
    filename="/home/user/Tupload/20186.txt"
    ####starting of the while loop.###########
    LIMIT='1500000000'
    while read line;
    do
        name="${line%\r'}"
        SIZE="$(ssh -n USER@REMOTEIP"df /var/www/Upload/" | awk 'NR > 1 {print $4; exit}')"

        if [[ $SIZE -gt $LIMIT ]]
        then
            YEAR=$(echo $name | cut -c 1-4)   #####define the Year from the read line ####
            MONTH=$(echo $name | cut -c 5-6)  #####Define the Month from the read line####
            DAY=$(echo $name | cut -c 7-8)  #####Define the DAY from the read line####
            YM=${YEAR}-${MONTH} ####define the Year and Month######

            april="2017-04"
            may="2017-05"
            june="2017-06"
            march="2017-03"
            ######if else statement ######
            if [ "$april" = "$YM"  ]; then
                cd /mnt/smxfxml/$YEAR/April/
            elif [ "$may" = "$YM"  ]; then
                cd /mnt/smxfxml/$YEAR/May/
            elif [ "$june" = "$YM"  ]; then
                cd /mnt/smxfxml/$YEAR/June/
            elif [ "$march" = "$YM"  ]; then
                cd /mnt/smxfxml/$YEAR/March/
            else
                cd /mnt/smxfxml/$YEAR/$YM/
            fi

            ssh USER@REMOTEIP"mkdir $YEAR/$MONTH/$DAY/$name/" < /dev/null
            scp $name.mxf USER@REMOTEIP:$YEAR/$MONTH/$DAY/$name/
            cd /mnt/smxfxml/XML/$YEAR/$YM/
            scp $name.xml USER@REMOTEIP:$YEAR/$MONTH/$DAY/$name/
        else 
            echo 'Not enough space.'; sleep 4h
        fi
    done <"$filename"
    rm -rf /home/user/Tupload/upload-lock
    exit 0
else
    sleep 0 
fi
exit 0
EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2018-08-01 10:53:04

感谢pa4080的“自由空间”一个班轮。

现在您已经共享了您的脚本:

这将更加困难,因为我们不能在continue循环中使用while read line而不跳过行。

您希望在不超过0.5TB空闲时暂停脚本,当至少有1TB空闲时继续运行。

为了保持脚本的简短性和可读性,定义一个函数,告诉您服务器上是否有足够的空间,并以最小大小作为参数:

代码语言:javascript
复制
enough_space () {
    local limit=$1
    free_space="$(ssh -n user@host "df /" | awk 'NR > 1 {print $4; exit}')"
    [ $free_space -ge $limit ]
}

...and要么睡眠while不足够的空间:

代码语言:javascript
复制
while ! enough_space $limit; do
    sleep 4h
done

...or睡眠直到有足够的空间:

代码语言:javascript
复制
until enough_space $limit; do
    sleep 4h
done

将其包含在脚本

将其放在脚本的开头:

代码语言:javascript
复制
pause_limit='500000000'    # 0.5TB free space
resume_limit='1000000000'  # 1.0TB free space

enough_space () {
    local limit=$1
    free_space="$(ssh -n user@host "df /" | awk 'NR > 1 {print $4; exit}')"
    [ $free_space -ge $limit ]
}

我们将在现有的while循环中引入一个“无限”的while循环。这使我们能够在第一次没有足够的空闲空间时再次重试同一个文件。此外,分配变量不依赖于服务器的空闲空间,因此应该将其保留在if语句(和内部while循环)之外。

代码语言:javascript
复制
####starting of the while loop.###########
while read line; do 
#### this can all be done before checking the server's free space
#    name="${line%“无限”while循环将运行一次(如果服务器上有足够的空闲空间)或两次(如果再次有足够的空闲空间)。附加备注如果要一次又一次地运行复制例程,请使用无限时间循环(while true; do...)。不要执行递归调用(调用脚本中的脚本或函数中的函数),因为这会增加调用堆栈的大小,脚本迟早会崩溃。当然,这只是实现相同目标的许多方法中的一种。这种方法的一个缺点是,每当空闲空间低于0.5TB或超过1.0TB时,就会有一个不必要的enough_space调用。如果我误解了你的问题,请告诉我,这样我就可以修改我的答案。\r'}"
#    YEAR=$(echo $name | cut -c 1-4) 
#      .
#      .
    ######if else statements ######
#    if [ "$april" = "$YM"  ]; then
#      .
#      .
#    fi

    while true; do
        if enough_space $pause_limit;
        then
            ssh USER@REMOTEIP"mkdir $YEAR/$MONTH/$DAY/$name/" < /dev/null
            scp $name.mxf USER@REMOTEIP:$YEAR/$MONTH/$DAY/$name/
            cd /mnt/smxfxml/XML/$YEAR/$YM/
            scp $name.xml USER@REMOTEIP:$YEAR/$MONTH/$DAY/$name/
            break
        else
            until enough_space $resume_limit; do
                sleep 4h
            done
        fi
    done
done <"$filename"

“无限”while循环将运行一次(如果服务器上有足够的空闲空间)或两次(如果再次有足够的空闲空间)。

K114附加备注K215

如果要一次又一次地运行复制例程,请使用无限时间循环(D16)。不要执行递归调用(调用脚本中的脚本或函数中的函数),因为这会增加调用堆栈的大小,脚本迟早会崩溃。

当然,这只是实现相同目标的许多方法中的一种。这种方法的一个缺点是,每当空闲空间低于0.5TB或超过1.0TB时,就会有一个不必要的D17调用。

如果我误解了你的问题,请告诉我,这样我就可以修改我的答案。

票数 2
EN

Ask Ubuntu用户

发布于 2018-08-01 07:04:02

首先,我建议您使用命令df获得空闲空间。此外,您还应该提供一个系统路径(例如/)或设备名称(例如/dev/sda1)来使事情变得简单。在我的VPS上执行的命令df /的输出如下:

代码语言:javascript
复制
$ ssh -n user@host "df /"
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/vda1       25671932 8335064  16009768  35% /

我们只需要可用的空间,这样就可以借助awk (例如)过滤输出:

代码语言:javascript
复制
$ ssh -n user@host "df /" | awk 'NR > 1 {print $4; exit}'
16009768

其次,对于变量$LIMIT1.5TB= 1500000000 KB的值,使用相同的单元作为上述命令(1K-块)的输出。

第三,将主逻辑放入一个函数中,该函数将在sleep命令之后递归地调用自己。此外,sleepcontinue的位置应该颠倒,我认为:)

根据以上所述,脚本可以如下所示:

代码语言:javascript
复制
#!/bin/bash -e

LIMIT='1500000000'

# define the function
main() {
    SIZE="$(ssh -n user@host "df /" | awk 'NR > 1 {print $4; exit}')"

    if [[ $SIZE -gt $LIMIT ]]
    then 
        echo 'continue'
    else
        echo 'Not enough space.'; sleep 4h
        # call the function
        main
    fi
}

# initial call of the function
main

根据@danzel's的评论,而不是递归,我们可以使用无限while循环:

代码语言:javascript
复制
#!/bin/bash -e

LIMIT='1500000000'

while true
do
    SIZE="$(ssh -n user@host "df /" | awk 'NR > 1 {print $4; exit}')"

    if [[ $SIZE -gt $LIMIT ]]
    then
        # remove the exit command if you do not want to interupt the loop
        echo 'continue'; exit
    else
        echo 'Not enough space.'; sleep 4h
    fi
done
票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1061310

复制
相关文章

相似问题

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