【问题标题】:check disk space while copying in shell script在 shell 脚本中复制时检查磁盘空间
【发布时间】:2017-02-16 22:25:17
【问题描述】:

我正在使用 GNU 并行复制文件,如下所示,它工作正常。

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 磁盘。它们是两个不同的磁盘。

【问题讨论】:

  • 你有两个命令“df”和“du”en.wikipedia.org/wiki/Df_(Unix)
  • 是的,我知道,但是在每次复制任何内容之前如何检查是否剩余 20% 的空间?

标签: linux bash shell disk gnu-parallel


【解决方案1】:

在调用scp之前在复制函数中运行类似这样的操作:

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的退出值传播到脚本的退出值

【讨论】:

  • 您能否为我添加一些解释,以便我理解这些东西以及它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
相关资源
最近更新 更多