我正在编写一个小脚本来将文件上传到远程ssh服务器,而在远程ssh服务器上,我将拥有几乎可用的2 TB of Space。
我需要在shell脚本中检查空间是否围绕着1.5 TB满,而不是sleep the script和**start the script again**,一旦它返回到1TB
下面是代码的一部分,它需要运行检查目录大小的逻辑,然后将其放入if else statements中。
SIZE="$(ssh archiveupload@REMOTESERVER-IP "du -s")"
LIMIT="1.5TB"
if [ $SIZE -gt $LIMIT ];
then
sleep 4h
elif
continue ;
fi更新脚本:
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发布于 2018-08-01 10:53:04
感谢pa4080的“自由空间”一个班轮。
现在您已经共享了您的脚本:
这将更加困难,因为我们不能在continue循环中使用while read line而不跳过行。
您希望在不超过0.5TB空闲时暂停脚本,当至少有1TB空闲时继续运行。
为了保持脚本的简短性和可读性,定义一个函数,告诉您服务器上是否有足够的空间,并以最小大小作为参数:
enough_space () {
local limit=$1
free_space="$(ssh -n user@host "df /" | awk 'NR > 1 {print $4; exit}')"
[ $free_space -ge $limit ]
}...and要么睡眠while不足够的空间:
while ! enough_space $limit; do
sleep 4h
done...or睡眠直到有足够的空间:
until enough_space $limit; do
sleep 4h
done中
将其放在脚本的开头:
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循环)之外。
####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调用。
如果我误解了你的问题,请告诉我,这样我就可以修改我的答案。
发布于 2018-08-01 07:04:02
首先,我建议您使用命令df获得空闲空间。此外,您还应该提供一个系统路径(例如/)或设备名称(例如/dev/sda1)来使事情变得简单。在我的VPS上执行的命令df /的输出如下:
$ ssh -n user@host "df /"
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 25671932 8335064 16009768 35% /我们只需要可用的空间,这样就可以借助awk (例如)过滤输出:
$ ssh -n user@host "df /" | awk 'NR > 1 {print $4; exit}'
16009768其次,对于变量$LIMIT:1.5TB= 1500000000 KB的值,使用相同的单元作为上述命令(1K-块)的输出。
第三,将主逻辑放入一个函数中,该函数将在sleep命令之后递归地调用自己。此外,sleep和continue的位置应该颠倒,我认为:)
根据以上所述,脚本可以如下所示:
#!/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循环:
#!/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
donehttps://askubuntu.com/questions/1061310
复制相似问题