1

我有两个 shell 脚本要编写,它们将通过 cron 计划每晚执行。

在我的生产服务器上:

  1. mysqldump -ufoo -pbar --opt --routines db > ~/sqldump/{$todays_date}.sql
  2. ln -s ~/sqldump/{$todays_date}.sql latest.sql

在我的开发服务器上:

  1. scp foo@domain.tld:~/sqldump/latest.sql ~/sqldump
  2. mysql -ufoo -pbar db < latest.sql

我有两个问题:

  1. 在生产服务器工作中,我如何$todays_date填写日期?例如,“2010-07-21”
  2. 如何让第二步等待第 1 步在每项工作中完成?
4

2 回答 2

3

要获取今天的日期,请使用date +%F

command > ~/sqldump/$(date +%F).sql

要详细了解可用于日期+格式的各种选项,请查看日期手册页。

至于等待,我假设您的意思是在您的产品服务器上的命令完成之前,您不想在您的开发服务器上运行该命令。最好的办法是让开发服务器使用 ssh(即ssh user@host "mysqldump ... > ... && ln -s ...)启动命令。

如果您不想这样做,我能想到的最好的方法是使用临时文件,以便转储文件的创建是原子的:

mysqldump ... > ~/sqldump/tmp$$ && mv ~/sqldump/tmp$$ ~/sqldump/$(date +%F).sql

然后,如果您的开发服务器请求是今天日期的转储,那么您可以循环直到 scp 成功:

while ! scp foo@domain.tld:~/sqldump/$(date +%F).sql ~/sqldump; do
    # file not present yet, sleep 1 minute and try again
    sleep 60
done
mysql -ufoo -pbar db < latest.sql
于 2010-07-21T19:14:59.723 回答
2

除非您在第一步的命令末尾使用“&”,否则第二步将自动等待它。

于 2010-07-21T19:17:23.983 回答