gpt4 book ai didi

linux - Bash sizeout 脚本

转载 作者:太空宇宙 更新时间:2023-11-04 10:22:24 25 4
gpt4 key购买 nike

我非常喜欢这种风格,bash 如何处理 shell。我正在寻找 native 解决方案来涵盖用于测试结果文件大小的 bash 命令,并在结果文件太大的情况下退出。

我正在考虑这样的命令

sizeout $fileName $maxSize otherBashCommand

在备份脚本中使用它会很有用,例如:

sizeout $fileName $maxSize timeout 600s ionice nice sudo rear mkbackup

为了让它更复杂,我会通过 ssh 调用它:

    ssh $remoteuser@$remoteServer sizeout $fileName $maxSize timeout 600s ionice nice sudo rear mkbackup

为此我应该使用哪种设计模式

解决方案

我稍微修改了Socowi的代码

#! /bin/bash
# shell script to stop encapsulated script in the case of
# checked file reaching file size limit
# usage
# sizeout.sh filename filesize[Bytes] encapsulated_command arguments

fileName=$1 # file we are checking
maxSize=$2 # max. file size (in bytes) to stop the pid
shift 2

echo "fileName: $fileName"
echo "maxSize: $maxSize"


function limitReached() {
if [[ ! -f $fileName ]]; then
return 1 # file doesn't exist, return with false
fi
actSize=$(stat --format %s $fileName)
if [[ $actSize -lt $maxSize ]]; then
return 1 # filesize under maxsize, return with false
fi
return 0
}

# run command as a background job
$@ &
pid=$!

# monitor file size while job is running
while kill -0 $pid; do
limitReached && kill $pid
sleep 1
done 2> /dev/null

wait $pid # return with the exit code of the $pid

我在末尾添加了 wait $pid,它返回后台进程的退出代码而不是退出代码。

最佳答案

每隔 n 个时间单位监控文件大小

不知道你的问题有没有设计模式,不过你可以这样写sizeout脚本:

#! /bin/bash

filename="$1"
maxsize="$2" # max. file size (in bytes)
shift 2

limitReached() {
[[ -e "$filename" ]] &&
(( "$(stat --printf="%s" "$filename")" >= maxsize ))
}

limitReached && exit 0

# run command as a background job
"$@" &
pid="$!"

# monitor file size while job is running
while kill -0 "$pid"; do
limitReached && kill "$pid"
sleep 0.2
done 2> /dev/null

此脚本每 200 毫秒检查一次文件大小,如果文件大小超过最大值,则终止您的命令。由于我们仅每 200 毫秒检查一次,因此文件最终可能会超过指定的最大大小 (yourWriteSpeed Bytes/s × 0.2s)。

以下几点可以改进:

  • 验证参数。
  • 设置一个 trap 以在任何情况下终止后台作业,例如当按下 Ctrl+C 时。

监控文件变化

上面的脚本不是很有效,因为我们每 200 毫秒检查一次文件大小,即使文件根本没有改变。 inotifywait 允许您等待文件更改。参见 this answer获取更多信息。

SSH 简介

你只需要将 sizeout 脚本复制到你的远程服务器,然后你就可以像在本地机器上一样使用它了:

 ssh $remoteuser@$remoteServer path/to/sizeout filename maxSize ... mkbackup

关于linux - Bash sizeout 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43318170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com