Shell【脚本 06】监测文件数据量并压缩及查看远程服务器状态并删除文件脚本分享

监测文件数据量并压缩及查看远程服务器状态并删除文件

  • 1.需求说明
  • [2.两个 shell 脚本](#2.两个 shell 脚本)
    • [2.1 监测文件数量并压缩](#2.1 监测文件数量并压缩)
    • [2.2 查看远程服务器状态并删除文件](#2.2 查看远程服务器状态并删除文件)
  • 3.定时任务
  • 4.总结

1.需求说明

项目有这样一个需求,物联网设备会传输两份数据到不同服务器的 FTP 目录下,当主 FTP 服务器正常时,备份 FTP 目录下的文件要进行定时清理,而备份 FTP 目录下的文件首先要进行压缩,然后放置到同步目录,如果主 FTP 正常,则同步目录的文件进行删除。

2.两个 shell 脚本

2.1 监测文件数量并压缩

zip_and_move.sh脚本的处理流程:

  1. 获取目标目录文件数据量
  2. 判断目标目录文件数据量
  3. 获取相应数量的文件列表
  4. 压缩文件列表文件到目标目录
  5. 删除文件列表文件
shell 复制代码
#!/bin/bash
# 数据目录
SOURCE_DIR="/ftp/data"
# 同步目录
DEST_DIR="/ftp/dataSync"

# 获取文件总数
FILE_COUNT=(` find $SOURCE_DIR -type f | wc -l `)
echo "$SOURCE_DIR-$FILE_COUNT个文件" 
# 判断文件数量
if [ $FILE_COUNT -gt 50 ]; then
    echo "源目录文件数超过50个,开始处理..."
    # 获取最新的50个文件
    FILE_LIST=$(find "$SOURCE_DIR" -maxdepth 1 -type f -printf '%T@ %p\n' | sort -nr | head -n 50 | cut -d' ' -f2-)
    # 生成压缩包名
    ZIP_NAME="archive_$(date +%Y%m%d_%H%M%S).zip"
    ZIP_PATH="$DEST_DIR/$ZIP_NAME"
    # 执行压缩
    zip -f "$ZIP_PATH" $FILE_LIST 
    echo "压缩完成,文件已保存至:$ZIP_PATH"
	for f in {$FILE_LIST} ;
	do 
		echo "删除文件$f"
		rm -f "$f"; 
	done
	echo "删除压缩后的源文件成功"
else
    echo "源目录文件数未超过50个,无需处理。"
fi

需要注意的三个地方:

  1. 执行命令需要用_`_ 符号(键盘左上角的反引号)
shell 复制代码
FILE_COUNT=(` find $SOURCE_DIR -type f | wc -l `)
  1. 获取文件列表时使用_$()_
shell 复制代码
FILE_LIST=$(find "$SOURCE_DIR" -maxdepth 1 -type f -printf '%T@ %p\n' | sort -nr | head -n 50 | cut -d' ' -f2-)
  1. 压缩文件时不保留路径信息使用_-f_
shell 复制代码
zip -f "$ZIP_PATH" $FILE_LIST

2.2 查看远程服务器状态并删除文件

check_and_delete.sh脚本的三个函数:

  1. 检测远程主机状态(主机上的 FTP 服务是有保活机制的,主机正常则认为主 FTP 服务正常)
  2. 清理目录文件
  3. 主线程(检测主机判断是否在线,执行清理目录文件操作)
shell 复制代码
#!/bin/bash
# 参数配置
REMOTE_HOST="${1:-192.168.0.1}"
CLEAN_DIR="/ftp/dataSync"
LOG_FILE="/logs/check.log"
PING_COUNT=3
PING_TIMEOUT=2
# 日志函数
log(){
	echo "[(`date`+1)]" | tee -a "$LOG_FILE"
}
# 检测远程主机状态
check_host_status(){
	if ping -c $PING_COUNT -W $PING_TIMEOUT "$REMOTE_HOST" > /dev/null 2>&1; then
		return 0
	else
		return 1
	fi
}
# 清理目录文件
cleanup_directory(){
	local file_count=` find $CLEAN_DIR -type f | wc -l `
	echo "$CLEAN_DIR(共{$file_count})个文件" 
	if [ $file_count -eq 0 ]; then
		echo "目录为空,不用清理:$CLEAN_DIR"
	else
		echo "开始清理目录:$CLEAN_DIR(共{$file_count})个文件"
		find "$CLEAN_DIR" -type f -delete
		echo "清理完成:$CLEAN_DIR"		
	fi
}
# 主线程
main(){
	echo "开始检测远程主机:$REMOTE_HOST"
	if check_host_status; then
		echo "远程主机在线:$REMOTE_HOST"
		cleanup_directory
	else
		echo "远程主机离线:$REMOTE_HOST"
	fi
	echo "检测完成"
}
# 执行主线程
main

Shell 脚本的语法还是有点儿难度,我也是求助 ai 东拼西凑、在服务器上反复测试修改才实现功能的。

3.定时任务

shell 复制代码
# 可执行权限
chmod +x /*.sh

# 定时调用
* * * * * sh /zip_and_move.sh
0 0 * * * sh /check_and_delete.sh

4.总结

Shell 脚本可以实现很多强大的功能而且编写和部署都很轻量化。本次的两个脚本还有很多可以优化的地方,比如写日志等。

相关推荐
一个平凡而乐于分享的小比特2 小时前
Linux、Debian、Yocto、Buildroot、Android系统详解
android·linux·操作系统·debian·yocto·buildroot
赖small强2 小时前
【Linux C/C++开发】深入解析 Linux C/C++ 中的 Deferred Crash (延迟崩溃)
linux·c语言·c++·asan·core dump·延迟奔溃·mprotect
繁华似锦respect2 小时前
C++ 智能指针设计模式详解
服务器·开发语言·c++·设计模式·visual studio
郝学胜-神的一滴2 小时前
Linux进程创建的封装与设计模式应用:结构化分析与实践指南
linux·服务器·开发语言·c++·程序人生·设计模式
infiniteWei2 小时前
【VIM 入门到精通】快速查找与替换:定位和修改文本的利器
linux·编辑器·vim
infiniteWei2 小时前
【VIM 入门到精通】视觉模式与剪贴板:高效选择、复制与粘贴
linux·编辑器·vim
追风少年ii2 小时前
脚本测试--R版本 vs python版本的harmony整合效果比较
linux·python·机器学习·空间·单细胞·培训
darryrzhong2 小时前
GalleryPicker:一个基于 Android 官方 Photo Picker API 封装的现代图片/视频选择库
android·kotlin·github·相机
infiniteWei2 小时前
【VIM 入门到精通】精准光标移动与文本对象:Vim思维的进阶
linux·编辑器·vim