我正在使用GNU parallel并行复制文件,如下所示,它工作正常。
export COPY_PRI=/abc/pri
export COPY_SEC=/pqr/sec
export status_dir=$(mktemp -t -d transfer.XXXXXX)
cleanup() { rm -rf "$status_dir"; }
trap cleanup 0
copy() {
el=$1
PRIMSEC=$2
scp bullseye@"$MACHINE_ONE":"$dir3"/process_"$el"_210_5.data "$PRIMSEC"/. || { touch "$status_dir/local_down" && scp bullseye@"$MACHINE_TWO":"$dir3"/process_"$el"_210_5.data "$PRIMSEC"/.; } || { touch "$status_dir/pri_down" && scp bullseye@"$MACHINE_THREE":"$dir3"/process_"$el"_210_5.data "$PRIMSEC"/.; } || { touch "$status_dir/sec_down" && exit 1; }
}
export -f copy
parallel -j 3 copy {} $COPY_PRI ::: "${PRI_FILES[@]}" &
parallel -j 3 copy {} $COPY_SEC ::: "${SEC_FILES[@]}" &
wait
现在我想在复制任何新文件之前检查磁盘空间。如果磁盘剩余20%的空间,则只有在没有剩余20%的空间时才复制,然后退出shell脚本,并显示错误消息和非零状态代码。那么如何在每次scp复制后检查磁盘空间并确保它没有达到限制?我必须检查/abc
和/pqr
磁盘。它们是两个不同的磁盘。
答案 0 :(得分:3)
在调用scp
之前在copy函数中运行类似的东西:
df /abc /pqr | awk 'NR>1 {gsub(/%/,""); if ($5 > 80) {exit 1}}' || exit 1
解释(根据要求):
df /abc /pgr
:获取已加载/abc
和/pgr
| awk
:管道到awk
解释器,后跟awk
脚本
NR>1 { ... }
:对行号执行此块> 1(即忽略标题行)gsub(/%/,"")
:无任何替换百分号,这样就不会破坏数字比较if ($5 > 80) { ... }
:如果行上的第五个字段($5
)大于80,请执行此代码块exit 1
:退出awk
,返回值为1,表示错误|| exit 1
:将awk
的退出值传播到脚本的退出值