提问人:jerivas 提问时间:6/21/2014 更新时间:6/21/2014 访问量:1071
While 循环在使用 rsync 时仅执行一次
While loop executes only once when using rsync
问:
我创建了一个 bash 脚本,用于将站点和数据库从一台服务器迁移到另一台服务器: 算法:
- 解析文件以为所有指定的 Postgres 数据库创建单独的转储。
.pgpass
- 通过 将所述转储上传到另一台服务器。
rsync
- 也通过 rsync 将一堆与每个数据库相关的文件夹上传到另一台服务器。
由于数据库和文件夹具有相同的名称,因此如果脚本知道数据库名称,则可以预测文件夹的位置。我面临的问题是循环只执行一次(只有 .pgpass 的第一行被完成)。
这是我的脚本,将在源服务器中运行:
#!/bin/bash
# Read each line of the input file, parse args separated by semicolon (:)
while IFS=: read host port db user pswd ; do
# Create the dump. No need to enter the password as we're using .pgpass
pg_dump -U $user -h $host -f "$db.sql" $db
# Create a dir in the destination server to copy the files into
ssh [email protected] mkdir -p webapps/$db/static/media
# Copy the dump to the destination server
rsync -azhr $db.sql user@destination:/home/user
# Copy the website files and folders to the destination server
rsync -azhr --exclude "*.thumbnails*" webapps/$db/static/media/ [email protected]:/home/user/webapps/$db/static/media
# At this point I expect the script to continue to the next line, but if exits at the first line
done < $1
这是 .pgpass,要解析的文件:
localhost:*:db_name1:db_user1:db_pass1
localhost:*:db_name3:db_user2:db_pass2
localhost:*:db_name3:db_user3:db_pass3
# Many more...
我是这样称呼它的:
./my_script.sh .pgpass
在这一点上,一切正常。将创建第一个转储,并将其与相关文件和文件夹一起传输到目标服务器。问题是脚本在那里完成,并且不会解析 .我已经注释掉了所有相关的行(因此脚本只创建转储),并且它工作正常,对脚本中的每一行执行一次。如何让脚本在执行 rsync 后不退出?.pgpass
rsync
顺便说一句,我使用基于密钥的 ssh 身份验证来连接服务器,因此脚本完全没有提示。
答:
2赞
that other guy
6/21/2014
#1
让我们问一下shellcheck:
$ shellcheck yourscript
In yourscript line 4:
while IFS=: read host port db user pswd ; do
^-- SC2095: ssh may swallow stdin, preventing this loop from working properly.
In yourscript line 8:
ssh [email protected] mkdir -p webapps/$db/static/media
^-- SC2095: Add < /dev/null to prevent ssh from swallowing stdin.
你去吧。
评论
0赞
jerivas
6/21/2014
非常好!我只是将 -n 选项传递给 ssh,它完成了同样的事情,它现在正在工作。感谢您分享 shellcheck。
评论