Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tar解压进度查看

tar解压进度查看

原创
作者头像
大大刺猬
发布于 2024-03-04 07:11:45
发布于 2024-03-04 07:11:45
1.1K0
举报

导读

之前有写mysql数据导入进度查看, 现在又想看下其它比较耗时的进度了, 比如查看tar解压的剩余时间, 虽然解压通常很快(顺序IO), 但有个时间, 尤其是进度条 会显得很高大上 -_-

其实主要是顺便改进下脚本, 支持多个进程的进度查看.

原理

还是和之前一样的, 查看当前的 /proc/PID/iorchar 然后除以总大小, 就得到进度了. 剩余大小再除以速度就是剩余时间了.

又区别的就是, 我们可以使用如下命令查看 压缩包解压后的大小.

gzip

代码语言:shell
AI代码解释
复制
gzip -l /root/mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz

xz

代码语言:shell
AI代码解释
复制
xz -l /root/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz

由于我们要支持多个进度条同时显示, 我们就要固定进度条的位置(行号). 可以使用 ANSI escape code来定位光标,并打印进度条. 还是来看时间演示例子吧.

测试

这里同时解压 xz 和 gz 文件 , 方便观察

代码语言:bash
AI代码解释
复制
tar -xvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz
tar -xvf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz

然后使用本脚本(见文末)来观察进度

代码语言:bash
AI代码解释
复制
sh tar_gz_or_xz_progress_view.sh

我们可以看到 gzip 压缩率比 xz高, 解压速度还更快. 建议使用gzip来压缩

我们就可以动态的看到解压进度了. 那么这有啥用呢? 没啥用, 光是花里胡哨的. 不, 这可以让我们的终端看起来更酷. 写脚本的时候, 就可以把这个脚本带上, 让我们的其它脚本也花里胡哨的更优雅.

附源码

github地址: https://github.com/ddcw/ddcw/blob/master/shells/tar_gz_or_xz_progress_view.sh

tar_gz_or_xz_progress_view.sh 也可以见如下:

直接使用, 不需要参数. SLEEP_INTERNAL 表示每隔多少秒显示一次. 就是显示频率

代码语言:bash
AI代码解释
复制
#!/usr/bin/env bash
#write by ddcw @https://github.com/ddcw
# tar.gz/tar.xz 解压进度查看脚本

export LANG="en_US.UTF-8"
SLEEP_INTERNAL=0.1

jindutiao2(){
	PID=$1
	lineno=$2
	PRONAME=`cat /proc/${PID}/comm`
	FILENAME=`ls -l /proc/${PID}/fd/0 | awk '{print $NF}'`
	SOURCE_SIZE=`stat -c "%s" ${FILENAME} | awk '{size = $1; if (size < 1024) { printf "%.2f B\n", size } else if (size < 1024 * 1024) { printf "%.2f KiB\n", size / 1024 } else if (size < 1024 * 1024 * 1024) { printf "%.2f MiB\n", size / 1024 / 1024 } else { printf "%.2f GiB\n", size / 1024 / 1024 / 1024 } }'`
	if [ "${PRONAME}" == "xz" ];then
		DEST_SIZE="`xz -l ${FILENAME} | tail -1 | awk '{print $5,$6}'`"
	elif [ "${PRONAME}" == "gzip" ];then
		DEST_SIZE="`gzip -l ${FILENAME} | tail -1 | awk '{print $2}' | awk '{size = $1; if (size < 1024) { printf "%.2f B\n", size } else if (size < 1024 * 1024) { printf "%.2f KiB\n", size / 1024 } else if (size < 1024 * 1024 * 1024) { printf "%.2f MiB\n", size / 1024 / 1024 } else { printf "%.2f GiB\n", size / 1024 / 1024 / 1024 } }'`"
	else
		break
	fi
	TOTAL_SIZE=`stat -c '%s' ${FILENAME}`
	CURRENT_SIZE=0
	OLD_SIZE=`awk '{ if ($1=="rchar:") print $2}' /proc/${PID}/io 2>/dev/null`
	START_TIME=`date +%s`
	CURRENT_RATE="0 B/s"
	#不使用 kill -0 pid , 怕审计不过...
	while [ ${CURRENT_SIZE} -lt ${TOTAL_SIZE} ] && [ -d /proc/${PID} ];do
		CURRENT_SIZE=`awk '{ if ($1=="rchar:") print $2}' /proc/${PID}/io 2>/dev/null`
		TIME_DIFF="$[ $(date +%s) - ${START_TIME}  ]"
		if [ "${CURRENT_SIZE}" == "" ];then
			break
		fi
		if [ ${TIME_DIFF} -gt 0 ];then
			CURRENT_RATE=`echo "${OLD_SIZE} ${CURRENT_SIZE} ${TIME_DIFF}" | awk '{print ($2-$1)/$3}' | awk '{size = $1; if (size < 1024) { printf "%.2f B/s\n", size } else if (size < 1024 * 1024) { printf "%.2f KiB/s\n", size / 1024 } else if (size < 1024 * 1024 * 1024) { printf "%.2f MiB/s\n", size / 1024 / 1024 } else { printf "%.2f GiB/s\n", size / 1024 / 1024 / 1024 } }'`
			REST_TIME=`echo "${TOTAL_SIZE} ${CURRENT_SIZE} ${TIME_DIFF} ${OLD_SIZE}" | awk '{print ($1-$2)/(($2-$4)/$3)}' | awk '{printf "%.2f seconds\n",$1}'`
		else
			CURRENT_RATE="0 B/s"
			REST_TIME="0"
		fi
		filled_len=$((CURRENT_SIZE * 50 / ${TOTAL_SIZE}))
		bar=$(printf "%-${filled_len}s" "#" | sed 's/ /#/g')
		spaces=$(printf "%-$((50-filled_len))s" "")
		echo -ne "\033[${lineno};0H${PID}: |$bar$spaces| $[ ${CURRENT_SIZE} * 100 / ${TOTAL_SIZE} ]% RATE:${CURRENT_RATE} THE_REST_TIME:${REST_TIME} "
		sleep ${SLEEP_INTERNAL}
	done
	echo -e "\033[${lineno};0H${PID}: Done               ${FILENAME} RATE:${CURRENT_RATE} COMM:${PRONAME}  ${SOURCE_SIZE} --> ${DEST_SIZE}"
}


PIDS=(`pidof gzip`)
PIDS+=(`pidof xz`)
if [ -z ${PIDS}  ];then
	echo "NO gzip or xz is Running. "
	exit 1
fi
current_no=0
clear
for pid in ${PIDS[@]};do
	((current_no++))
	jindutiao2 ${pid} ${current_no} &
done
wait
exit 0

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[MYSQL] MySQL导入数据, 如何查看进度?
mysql在导入数据的时候, 想看下进度, 但是mysql命令行是没得相关进度的, 只能去数据库看下insert到哪张表了, 即使看了 也不知道还要多久....
大大刺猬
2024/02/23
1.3K0
[MYSQL] MySQL导入数据, 如何查看进度?
PYTHON 自作类tar工具 实现 数据归档,压缩,加密功能
对目录打包(归档),我们一般使用tar之类的命令来做, 原生的tar命令是单线程的, 也不支持加密操作. 当然可以借助第三方工具来实现, 但都使用第三方工具了, 为何不自己写一个呢.
大大刺猬
2023/04/19
1.1K0
PYTHON 自作类tar工具 实现 数据归档,压缩,加密功能
笔记分享(2) Linux常用操作
本文是记录我之前工作中用到的关于linux的知识的一部分. 主要是针对OEL/RHEL/Centos的, (shell功能主要用的是bash的)
大大刺猬
2021/04/01
6560
GitHub 下载东西很慢?不存在的~!
GitHub 是每一个程序员经常访问的网站之一,其实程序员的网站还有很多,比如 StackOverFlow。一提到 GitHub,大家第一个想到的一定是 clone 或者下载项目,可是大家在 clone 或者下载的时候会发现很慢,为什么?怎么解决?接下来我就着重解决这个问题。
不可言诉的深渊
2019/07/28
22.3K0
IO被谁吃了?
近期,兄弟部门在部署某环境的时候发现自己的业务容器莫名的 unavailable,这是怎么回事呢?今天我们一起来分析分析。
Python研究所
2022/06/17
3460
Linux 实用运维脚本分享
#查看僵尸进程 ps -al | gawk '{print $2,$4}' | grep Z # 匹配电子邮件的地址 cat index.html | egrep -o "[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}" > ans.txt #匹配http URL cat index.html | egrep -o "http://[A-Za-z0-9.]+\.[a-zA-Z]{2,3}" > ans.txt #纯文本形式下载网页 lynx -dump w
杰哥的IT之旅
2022/09/02
6.9K0
非常实用的常用Linux运维Shell脚本
废柴阿尤
2023/12/18
3950
Linux awk命令详细教程
AI摘要:本文详细介绍了Linux下的文本处理工具awk的使用方法,包括其语法、选项参数、内置变量、常用操作(如打印、条件判断、循环等)以及一些实用的示例。awk通过将文本按行读取并以指定的分隔符分割成多个字段,使得对文本的处理变得灵活高效。文章还提供了如何打印指定列、过滤日志、按条件统计、指定多个分隔符、日志切割、匹配指定列和统计文件大小等实际应用示例,以及一个统计nginx日志数据的awk脚本示例。通过这些内容,读者可以全面掌握awk命令的强大功能,有效地应用于日志分析、数据处理等场景。
曈曈too
2024/03/16
5030
[MYSQL] mysqldump导出进度查看脚本
之前写了mysqld导入进度查看脚本. https://www.modb.pro/db/1760934208826593280
大大刺猬
2024/06/05
3940
[MYSQL] mysqldump导出进度查看脚本
2021最新shell命令重置版整理(经典推荐)
文件 ls -rtl # 按时间倒叙列出所有目录和文件 ll -rt touch file # 创建空白文件 rm -rf dirname # 不提示删除非空目录(-r:递归删除 -f强制) dos2unix # windows文本转linux文本 un
IT运维技术圈
2022/06/26
3810
环境搭建-Nginx、MySQL
Nginx 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
wangmcn
2022/07/26
1.4K0
环境搭建-Nginx、MySQL
【Linux】实现进度条小程序
在之前已经了解了 【Linux】vim的使用和 【Linux】编译器-gcc/g++使用还有 【Linux】自动化构建工具-make/Makefile,有了这些工具,这次来实现一个进度条小程序。
zxctscl
2024/03/22
2970
【Linux】实现进度条小程序
【Linux】面试题(2020最新版)
为了便于理解,本文从常用操作和概念开始讲起。虽然已经尽量做到简化,但是涉及到的内容还是有点多。在面试中,Linux 知识点相对于网络和操作系统等知识点而言不是那么重要,只需要重点掌握一些原理和命令即可。为了方便大家准备面试,在此先将一些比较重要的知识点列出来:
瑞新
2020/07/07
2.8K0
linux tar备份,并比对tar备份是否成功
1、备份系统。tar备份系统并对比备份出来的文件.tar.bz2和实际的系统文件数目是否对应,以判断备份是否成功。备份时最好排除掉/sys和/var/run,否则最后可能会出现tar:由于前面的延迟错误而退出。 经过观察之前的错误输出看到错误都是来自/sys和/var/run而且这两个文件夹不需要备份。 tar: /sys/devices/platform/power/state:文件缩小 4094 字节;用零填充 tar: /sys/devices/platform/uevent:无法 open:
葫芦
2019/05/09
6K0
MOP 系列|MOP 三种主流数据库常用 SQL(三)PG篇
MOP 不用多说,指的就是 MySQL、Oracle、PostgreSQL 三种目前最主流的数据库,MOP 系列打算更新 MOP 三种数据库的索引知识、高可用架构及常用 SQL 语句等等,上面已经更新了 MOP 索引相关的文章,今天打算整理一下这三种数据库的常用 SQL 知识,由于文章过长,今天更新中间的一篇之 MySQL 篇。第一篇 Oracle 相关的详见下方链接:MOP 系列|MOP 三种主流数据库常用 SQL(一)。第二篇 MySQL 常用 SQL详见下方链接:MOP 系列|MOP 三种主流数据库常用 SQL(二)。
JiekeXu之路
2024/05/28
1860
MOP 系列|MOP 三种主流数据库常用 SQL(三)PG篇
大文件下载以及进度条展示和MD5校验
使用socket网络,上传一个视频,大小在3G左右 能够显示进度条,显示花费时间 下载使用TCP协议 server向client发送文件 新建文件server.py,代码如下: import os import json import socket import struct filepath = r'E:\BaiduYunDownload\[电影天堂www.dy2018.com]移动迷宫3:死亡解药BD国英双语中英双字.mp4' sk = socket.socket() sk.bind(('127.0
py3study
2018/08/02
7260
python 多用户在线的FTP程序
    移动和重命名: mv filename/dirname filename/dirname
py3study
2020/01/09
3K0
使用tar+pv 命令实现压缩和解压缩显示进度条
实现该功能需要安装 pv,然后把需要处理的数据通过管道传给 pv,最后再进行操作。
IT小马哥
2024/08/15
3450
shell 学习笔记(18)
声明:转载需署名出处,严禁用于商业用途! 1701.大量连接处于 TIME_WAIT 状态的解决方法: netstat -nt 看到大量 TIME_WAIT dmesg 看到 time wait bucket table overflow 解决办法:1、 /proc/sys/net/ipv4/tcp_max_tw_buckets 过小了,设成540000以上 2、 /sys/module/ip_conntrack/parameters/hashsiz
用户1177713
2018/02/24
2.1K0
unix常用命令对照表及常用命令资料
在AIX操作系统上有很多的命令。这里介绍一些系统级的命令,它将有助于回答一些常见问题。大家以此做参考,并补充修改。以下命令在AIX 5.1上测试通过。 · 关于内核 显示AIX系统内核是32位还是64位: bootinfo -K 如何改变内核模式(32位或64位) /unix文件连接到一个可引导的映像。通过命令ls -l /unix查看: /unix ->; /usr/lib/boot/unix_up # 32 bit uniprocessor kernel /unix ->; /usr/lib/boot/unix_mp # 32 bit multiprocessor kernel /unix ->; /usr/lib/boot/unix_64 # 64 bit multiprocessor kernel 在AIX系统安装时,缺省安装的内核是32位。可以用如下命令更改内核模式: ln -sf /usr/lib/boot/unix_64 /unixln -sf /usr/lib/boot/unix_64/usr/lib/boot/unixbosboot -ad /dev/hdiskxxshutdown -r 注意:/dev/hdiskxx是指引导逻辑卷/dev/hd5所在的硬盘。可通过下面命令来查看xx是几: lslv -m hd5 · 关于硬件 显示机器硬件是32位还是64位: bootinfo -y 查看机器的物理内存是多少: bootinfo -r 或 lsattr -El sys0 -a realmem 查看机器是否支持64位内核(是否64位硬件) /usr/sbin/bootinfo -p 如果返回32,则表示硬件是32位的;如果返回的是chrp,则表示硬件是64位的机器。 显示当前磁带设备rmt0的属性: lsattr -l rmt0 -E 显示缺省的磁带设备rmt0的属性: lsattr -l rmt0 -D 显示终端设备tty0的登录属性: lsattr -l tty0 -a login -R 显示系统级属性: lsattr -E -l sys0 查看当前系统有多少CPU: lscfg | grep proc 查看当前系统有多少硬盘而且是否被使用: Lspv 查看当前系统的详细配置: lscfg -pv 也可以显示某一设备的配置: lscfg -vl rmt0 查看当前系统的芯片名称、系统名、节点名、型号等: uname -p # 显示芯片名称,例如:powerpc uname -r # 显示操作系统的发行号 uname -s # 显示系统名,例如:AIX uname -n # 显示节点名 uname -a # 显示系统名、节点名、版本、机器ID uname -M # 显示型号,例如:IBM,7046-B50 uname -v # 显示操作系统版本 uname -m # 显示机器ID · 关于AIX 查看AIX的版本、发行号、ML(Maintenance Level)级别: oslevel -r 或 lslpp -h bos.rte 如何改变文件系统大小,例如:将/usr文件系统增加1000000字节: chfs -a size=+1000000 /usr 如何使用CD: mount -V cdrfs -o ro /dev/cd0 /cdrom 查看本机的IP地址: Ifconfig -a 或 host Fully_Qualified_Host_Name 例如:host cyclop.austin.ibm.com 查找哪一个文件集(fileset)包含特定的文件,例如:查找/usr/bin/vmstat属于哪一个文件集。 lslpp -w /usr/bin/vmstat 显示哪一个文件集包含/usr/bin/svmon: Which_fileset svmon 查看某一级别的ML中所有文件是否都已经安装: instfix -i | grep ML 如何确定某一补丁(fix)是否安装,例如:查看IY24043是否安装 instfix -ik IY24043 显示哪些文件集需要安装或修改: lppchk -v 查看交换区(paging space)的分配和使用: lsps -a · 关于卷组和逻辑卷 创建卷组: mkvg -y name_of_volume_group -s partition_size list_of_hard_disks partition_size单位是MB,它是1到1024之间的一个数。(2的次幂,例如:1,2, 4, 8, 16, 32等,缺省是4MB。) 创建逻辑卷: mklv -y name_of_logical_volume name_of_volume_group number_of_partition 显示当前系统的所有卷组: Lsvg 显示卷组rootvg的详细信息:
BUG弄潮儿
2022/06/30
2.2K0
相关推荐
[MYSQL] MySQL导入数据, 如何查看进度?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档