在Linux中如何监控dd命令的执行进度
转载地址,同时也进行了一些补充。谢谢原作者。
经常使用dd
命令制作linux系统盘,相当方便迅速。但是用了这么久,突然就想,要是能够知道dd
现在的进度该多好,于是查了查,果然找到了。
刻盘的时候,我们先在一个shell中使用dd
,比如我们把Arch Linux的镜像刻到U盘/dev/sdc
中:
lgl@pArch ~/Downloads $ sudo dd if=archlinux-2016.04.01-dual.iso of=/dev/sdc
- 此时,在另一个shell中,我们输入:
lgl@pArch ~ $ sudo watch -n 5 pkill -USR1 ^dd$
- 或者:
lgl@pArch ~ $ sudo watch -n 5 pkill -USR1 -x dd
- 然后,当前终端会显示:
Every 5.0s: pkill -USR1 -x dd
- 此时,使用dd命令的终端会显示进度,直到结束。
lgl@pArch ~/Downloads $ sudo dd if=archlinux-2016.04.01-dual.iso of=/dev/sdc
[sudo] lgl 的密码:
记录了234881+0 的读入
记录了234881+0 的写出
120259072 bytes (120 MB, 115 MiB) copied, 21.7691 s, 5.5 MB/s
记录了286353+0 的读入
记录了286353+0 的写出
146612736 bytes (147 MB, 140 MiB) copied, 26.7881 s, 5.5 MB/s
记录了338249+0 的读入
记录了338249+0 的写出
173183488 bytes (173 MB, 165 MiB) copied, 31.8169 s, 5.4 MB/s
……
-
解释:
watch - execute a program periodically, showing output fullscreen
watch
负责周期性执行一个程序,使用-n
可以指定执行的时间间隔。-d
则会高亮出这次执行和上次执行的结果变化了的地方。所以watch -n 5 pkill -USR1 ^dd$
就是每五秒执行一次pkill -USR1 ^dd$
。
pgrep, pkill - look up or signal processes based on name and other attributes
pkill
是根据名称或其他属性来查询进程或给进程发信号的。 所以pkill -USR1 ^dd$
就是给dd
进程发送信号USR1,USR1这个信号在man dd
里有解释:
Sending a USR1 signal to a running ‘dd’ process makes it print I/O statistics to standard error and then resume copying.
也就是说只要给dd
发送USR1信号,它就会在标准错误输出中输出I/O数据,并继续复制 (dd的进度输出就是这么设计的,再详细点 就是dd命令在执行的时候接收到SIGUSR1信号的输出当前的读写进度,而pkill命令在这里起的作用就是给dd进程发送这个信号)。这样的话就实现了当前进度的输出。
命令中最后的^dd$
自然是筛选名称中仅含有dd
的进程,否则,所有名称中包含dd
字段的进程都会被选中。我们做个实验:
lgl@pArch ~ $ pkill -USR1 dd
pkill: killing pid 2 failed: 不允许的操作
pkill: killing pid 43 failed: 不允许的操作
pkill: killing pid 282 failed: 不允许的操作
pkill: killing pid 548 failed: 不允许的操作
pkill: killing pid 2475 failed: 不允许的操作
lgl@pArch ~ $ ps -A | grep dd
2 ? 00:00:00 kthreadd
43 ? 00:00:00 ipv6_addrconf
282 ? 00:00:00 sddm
548 ? 00:00:00 sddm-helper
2475 pts/2 00:00:04 dd
2488 ? 00:00:00 ksysguardd
由上面可以看到,pkill
果然是向所有名称中包含dd
的进程都发送信号了。
另外,除了使用正则的表示方式之外,我们还可以使用-x
来指定进程名:
-x, –exact
Only match processes whose names (or command line if -f is specified) exactly match the pattern.
所以,pkill -USR1 -x dd
的作用就是向明确指定进程的名字就是dd的进程发送USR1信号。
所以说,我们通过pkill
(发信号)和watch
(周期性执行命令)的结合来实现了dd
进度的查看。
推荐阅读
-
紧急模式问题处理 - 图 1 紧急模式 根本原因分析 应急模式提供了尽可能小的环境,即使无法进入应急模式,也可以在其中修复系统。在应急模式下,系统只安装根文件系统供读取,不尝试安装任何其他本地文件系统,不激活网络接口,只启动一些基本服务。 进入应急模式的原因通常是 /etc/fstab 文件中存在错误,导致文件系统挂载失败。 文件系统中存在错误,导致。 约束和限制 本节适用于 Linux 操作系统紧急模式。程序涉及修复文件系统。修复文件系统有丢失数据的风险,因此请先备份数据,然后再执行修复操作。 处理方法 输入根密码,然后进入修复模式。 在应急模式下,根分区以只读模式挂载。要修改根目录中的文件,需要执行以下命令以读写模式重新挂载根分区。# mount -o rw,remount / 请执行以下命令首先检查 fstab 文件是否有误,然后尝试挂载所有未挂载的文件系统。# mount -a 如果挂载点不存在,请创建一个挂载点。 如果不存在此类设备,请注释或删除挂载行。 如果指定了不正确的挂载选项,请将挂载参数更改为正确的参数。 如果没有发生错误,但出现 UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY 消息(通常是由文件系统错误引起的),请跳至第 7 步。 执行以下命令打开 /etc/fstab 以修改相应的错误。# vi /etc/fstab /etc/fstab 文件包含以下字段,以空格分隔:[文件系统] [dir] [type] [options] [dump] [fsck] 表 1 /etc/fstab 参数 说明 参数 说明 [文件系统] 要挂载的分区或存储设备。 文件系统]列建议以 UUID 的形式写入。执行 blkid 命令可查询设备文件系统 UUID。 参考格式如下: # <device> <dir> <type> <options> <dump> <fsck>; UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2 使用 UUID 的好处是,它们与磁盘顺序无关。如果你在 BIOS 中更改了存储设备的顺序,或重新插入了存储设备,或者因为某些 BIOS 可能会随机更改存储设备的顺序,那么使用 UUID 会更有效率。 [文件系统] 文件系统]的挂载位置。 类型 挂载设备或分区的文件系统类型,支持多种不同的文件系统:ext2、ext3、ext4、reiserfs、xfs、jfs、smbfs、iso9660、vfat、ntfs、swap 和 auto。 设置为自动类型后,挂载命令会猜测所使用的文件系统类型,这对 CDROM 和 DVD 等移动设备非常有用。 选项 挂载时要使用的参数,有些参数是特定文件系统特有的。例如,默认值参数使用文件系统的默认挂载参数,ext4 的默认参数为:rw、suid、dev、exec、auto、nouser、async。 有关更多参数,请执行以下命令查看 man 手册:# man mount
-
在Linux中如何监控dd命令的执行进度
-
在Linux中,如何使用tar命令将当前工作目录下的所有文件及其子目录打包成压缩档案?
-
在 Linux 中,如何将 tar 命令的解压缩操作定向到特定文件夹?
-
简易上手:在Linux Shell中,执行多个命令的不同技巧 - 1. 用分号 (;) 连接各命令
-
Hashcat命令详解-常用 -a 指定要使用的破解模式,其值参考后面对参数。“-a 0”字典攻击,“-a 1” 组合攻击;“-a 3”掩码攻击。 -m 指定要破解的hash类型,如果不指定类型,则默认是MD5 -o 指定破解成功后的hash及所对应的明文密码的存放位置,可以用它把破解成功的hash写到指定的文件中 --force 忽略破解过程中的警告信息,跑单条hash可能需要加上此选项 --show 显示已经破解的hash及该hash所对应的明文 --increment 启用增量破解模式,你可以利用此模式让hashcat在指定的密码长度范围内执行破解过程 --increment-min 密码最小长度,后面直接等于一个整数即可,配置increment模式一起使用 --increment-max 密码最大长度,同上 --outfile-format 指定破解结果的输出格式id,默认是3 --username 忽略hash文件中的指定的用户名,在破解linux系统用户密码hash可能会用到 --remove 删除已被破解成功的hash -r 使用自定义破解规则 按s键可以查看破解的状态, p键暂停 r键继续破解 q键退出破解
-
Linux设备驱动开发详解——学习笔记-设备驱动来联系。在没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口。而在有操作系统的情况下,驱动的架构则由相应的操作系统来定义。驱动存在的意义就是给上层应用提供便利。 驱动针对的对象是存储器和外设。Linux将存储器和外设分为 3 个基础大类:字符设备、块设备、网络设备。 字符设备和块设备都被 Linux 映射到文件系统的文件和目录中,通过文件系统的接口(open、read、write、close等)来访问。其中,块设备可以通过类似 dd 命令对应的原始块设备来访问,也可以通过建立文件系统,以文件路径来访问。 学习 Linux 设备驱动,要求非常好的硬件基础、非常好的软件基础、一定的 Linux 内核基础和非常好的多任务并发控制和同步的基础。学习 Linux 设备驱动要将学习的函数、数据结构等放到整体架构中去理解,才能理清驱动中各组成部分之间的关系。 驱动设计的硬件基础 驱动工程师需要掌握 处理器、存储器、接口和总线、可编程门电路、原理图、硬件时序、芯片手册、仪器使用 等方面的内容。 处理器