代码之家  ›  专栏  ›  技术社区  ›  maček

如何在继续shell脚本之前等待任务完成

  •  1
  • maček  · 技术社区  · 14 年前

    我有两个要写的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. 如何使步骤2等待步骤1在每个作业中完成?
    2 回复  |  直到 14 年前
        1
  •  3
  •   R Samuel Klatchko    14 年前

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

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

    要了解更多有关可以与日期一起使用的各种选项的信息,请执行以下操作: + 格式化,查看日期手册页。

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

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

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

    然后,如果您的dev server请求是从今天的日期开始的转储,那么您可以循环直到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
    
        2
  •  2
  •   Darron    14 年前

    除非在步骤1的命令末尾使用“&”,否则步骤2将自动等待。