我正在尝试做这样的事情,我需要从 4 个 Blade 中获取备份,并且
所有都应该存储在 /home/backup/esa
位置下,其中包含 4
带有节点名称的目录(如 sc-1、sc-2、pl-1、pl-2)。每个
目录应包含相应节点的备份信息。
但是我看到“我从哪个节点执行命令,只有那个数据被 复制到所有 4 个目录”。知道为什么会这样吗?我的脚本是这样的:
for node in $(grep "^node" /cluster/etc/cluster.conf | awk '{print $4}');
do echo "Creating backup fornode ${node}";
ssh $node source /etc/profile.d/bkUp.sh;
asBackup -b /home/backup/esa/${node};
done
最佳答案
你的问题是这段代码:
ssh $node source /etc/profile.d/bkUp.sh;
asBackup -b /home/backup/esa/${node};
确实如此:
- 在
$node
上创建一个远程 shell> - 在远程shell中执行命令
source/etc/profile.d/bkUp.sh
- 关闭远程 shell 并忘记在该 shell 中所做的任何事情!!
- 在本地主机上运行
asBackup
。
这不是你想要的。将其更改为:
ssh "$node" "source /etc/profile.d/bkUp.sh; asBackup -b '/home/backup/esa/${node}'"
这样做:
- 在
$node
上创建一个远程 shell> - 执行命令
source/etc/profile.d/bkUp.sh; asBackup -b '/home/backup/esa/${node}'
在远程主机上
确保 /home/backup/esa/${node}
是 NFS 挂载(否则,文件只会备份到远程 主机)。
请注意,/etc/profile
是备份脚本(或其配置)的一个非常糟糕的地方。考虑将设置/配置移动到 /home/backup/esa
,它在集群的所有节点之间共享(或应该共享),因此在一个地方更改它会立即更新到所有地方。
另请注意引号的使用:单引号和双引号确保变量 node
中的空格不会导致意外问题。当然,"$node"中不太可能有空格,但如果有,错误消息会误导您。
所以总是正确引用。
关于linux - shell 脚本、for 循环、ssh 和别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8381938/