我编写了一个bash脚本rm_remote_file.sh
,该脚本SSH到一组远程计算机并删除文件。我在每个函数调用的末尾使用&
来并行运行这些命令,脚本如下所示:
#!/bin/bash
rm_remote_file() {
echo "Removing file on node $1:"
ssh $1 'rm ~/test_file'
}
for node in node1.com node2.com node3.com; do
rm_remote_file $node &
done
当每个节点上都有test_file时-rm
命令成功-此脚本的输出为:
Removing file on node node1.com:
Removing file on node node2.com:
Removing file on node node3.com:
我更喜欢打印每个主机名。但是,如果每个节点上都不存在test_file-rm
命令失败-此脚本的输出为:
rm: cannot remove ‘~/test_file’: No such file or directory
rm: cannot remove ‘~/test_file’: No such file or directory
rm: cannot remove ‘~/test_file’: No such file or directory
因此,此错误消息禁止打印节点的主机名。我认为这种行为与I / O重定向有关,使用2>&1
之类的东西可以解决此问题。但是我想知道为什么ssh命令错误消息会抑制echo命令。
请注意,这仅在ssh命令中发生,以下仅删除一些本地文件的脚本将同时输出“正在删除文件”和“没有此类文件或目录”。
#!/bin/bash
rm_file() {
echo "Removing file..."
rm ./$1
}
for file in test1 test2 test3 test4 test5; do
rm_file $file &
done
答案 0 :(得分:0)
在ssh命令中添加2>&1,并对该消息和错误按顺序排列:
ssh $1 'rm ~/test_file' 2>&1
讨论后的解决方案:
rm_remote_file() {
echo "Removing file on node $1: $( ssh $1 'rm ~/test_file' 2>&1 )"
}