Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 监控远程DD操作并显示进度_Bash_Ssh_Centos_Dd - Fatal编程技术网

Bash 监控远程DD操作并显示进度

Bash 监控远程DD操作并显示进度,bash,ssh,centos,dd,Bash,Ssh,Centos,Dd,让我先说“我不是程序员” 我有一个脚本,在测试期间执行该脚本在存储阵列上创建可用空间。脚本按设计工作,但是我在监控进度时遇到问题。我从主机(master)执行脚本。主机在后台对worker执行DD命令。每个工人定义了多个SDs。命令结构如下所示: ssh root@worker1 dd if=/dev/zero of=/dev/sdb bs=1G count=256 & ssh root@worker1 dd if=/dev/zero of=/dev/sdc bs=1G count=25

让我先说“我不是程序员”

我有一个脚本,在测试期间执行该脚本在存储阵列上创建可用空间。脚本按设计工作,但是我在监控进度时遇到问题。我从主机(master)执行脚本。主机在后台对worker执行DD命令。每个工人定义了多个SDs。命令结构如下所示:

ssh root@worker1 dd if=/dev/zero of=/dev/sdb bs=1G count=256 &
ssh root@worker1 dd if=/dev/zero of=/dev/sdc bs=1G count=256 &
ssh root@worker2 dd if=/dev/zero of=/dev/sdb bs=1G count=256 &
ssh root@worker2 dd if=/dev/zero of=/dev/sdc bs=1G count=256 &
ssh root@worker3 dd if=/dev/zero of=/dev/sdb bs=1G count=256 &
ssh root@worker3 dd if=/dev/zero of=/dev/sdc bs=1G count=256 &
ssh root@worker4 dd if=/dev/zero of=/dev/sdb bs=1G count=256 &
ssh root@worker4 dd if=/dev/zero of=/dev/sdc bs=1G count=256 &
这种方法非常有效,而且我在后端存储上获得了极好的写吞吐量。问题是我需要知道这些过程何时完成。当它们完成时,我需要执行下一阶段的测试

理想情况下,我需要一种持续监控工人DD过程并提供进度的方法。当它们全部完成时,脚本将退出,下一阶段的测试应该开始

更新***

我从使用DD切换到现在使用blkdiscard。这比我想做的要快得多。新的命令结构如下所示

ssh root@worker1 blkdiscard -o 256G -l 256G -p 1G /dev/sdb &
ssh root@worker1 blkdiscard -o 256G -l 256G -p 1G /dev/sdc &

如果这对其他任何人都有帮助。

如果在命令末尾添加双符号AND,则在第一个命令完成后,下一个写入的命令将启动

例如:

echo something && sleep 5 && echo anotherthing &

感谢@Sheller和我找到的另一篇帖子,我能够解决这个问题。我使用的不是等待,而是上一个运行命令的进程ID

#Execute blkdiscard on workers via remote SSH
ssh root@worker1 blkdiscard -o 256G -l 256G -p 1G /dev/sdb &
ssh root@worker1 blkdiscard -o 256G -l 256G -p 1G /dev/sdc &

# Process Id of the previous running command
pid=$!

# Spinning cursor string
spin='-\|/'

i=0
while kill -0 $pid 2>/dev/null
do
    # Progress message
    echo -ne "\033[2K\rPreparing array for snapshot testing ";

    # Spinning cursor on same line
    i=$(( (i+1) %4 ))
    echo -ne "${spin:$i:1}"
    sleep .1
done

然后,最终结果是消息:准备阵列进行快照测试,并在末尾使用旋转光标

在列出组中可以一起运行的所有cmd后,在脚本中使用
wait
。然后,脚本将
等待
,直到所有后台作业完成,然后再进入脚本中的下一步。对于上面的代码,只需在最后一行
ssh…
之后添加
wait
。加上uno代表Q,这比许多“程序员”提交的都好祝你好运。谢谢,添加等待有效,完成后会继续。问题是,用户坐在那里盯着黑屏,不知道发生了什么。是否可以将等待添加到循环中,以便它在等待时可以回显重复消息或各种进度条?我正在测试一个想法。几分钟后回来,我想我明白了。上面加了。很高兴你解决了。我在等待时尝试了一个基本的
循环,但它从未退出。但是我使用的是ksh,所以可能会有所不同。“我不是程序员”这句话真是太好了。(让我想起史蒂夫·西格尔,“我只是个厨师”)。将您的解决方案作为答案发布,您可以在48小时后接受您的答案,获得宝贵的声誉积分。祝你好运