当作为cron作业运行时,简单bash脚本以异步方式运行

时间:2014-01-04 06:18:14

标签: linux bash ssh cron

我编写了一个备份脚本,按此顺序执行以下操作:

  1. 在远程备份服务器上通过SSH压缩文件
  2. 转储我的本地数据库
  3. 通过SSH rsync将本地数据库传输到备份服务器
  4. 现在,当我从RHEL的命令行运行此脚本时,它可以正常工作。

    但是当我将此脚本设置为通过cronjob运行时,脚本会运行,但从我所知道的,它以某种方式同时运行上述3个命令。因此,事情正在按顺序完成(我的本地数据库在#1 zip工作实际完成之前已完成转储和转移)。

    有没有人遇到这种奇怪的情况?作为最简单的修复,有没有办法强制脚本同步运行?也许在继续之前添加某种命令来等待前一行完成?

    编辑我添加了备份脚本的示例版本。似乎我的脚本的第二行与我的脚本的第一行同时运行,所以当发出SSH命令时,它在我的第二行触发并开始SQL转储之前尚未完成。

    #!/bin/bash
    
    THEDIR="sample"
    THEDBNAME="mydatabase"
    
    ssh -i /rsync/mirror-rsync-key sample@sample.com "tar zcvpf /$THEDIR/old-1.tar /$THEDIR/public_html/*"
    
    mysqldump --opt -Q $THEDBNAME > mySampleDb
    
    /usr/bin/rsync -avz --delete --exclude=**/stats --exclude=**/error -e "ssh -i /rsync/mirror-rsync-key" /$THEDIR/public_html/ sample@sample.com:/$THEDIR/public_html/
    
    /usr/bin/rsync -avz --delete --exclude=**/stats --exclude=**/error -e "ssh -i /rsync/mirror-rsync-key" /$THEDIR/ sample@sample.com:/$THEDIR/
    

2 个答案:

答案 0 :(得分:1)

除非您明确使用背景(&),否则所有内容都应该逐个运行,等到之前完成。 也许你实际上看到cron重复先前的执行?如果是这样,您可以通过使用flock调用脚本来阻止多次执行

e.g。来自

的午夜cron入场券

0 0 * * * backup.sh

0 0 * * * flock -n /tmp/backup.lock -c backup.sh

答案 1 :(得分:0)

如果您想按顺序运行命令,可以使用; 运算符。

- 分号运算符

此运算符一次运行多个命令,但按顺序运行。如果我们用分号分隔三个命令,第二个命令将在第一个命令完成后运行,第三个命令将在第二个命令执行完成后运行。我们应该知道的一点是,要运行第二个命令,它不依赖于第一个命令退出状态。

依次在一行中执行ls,pwd,whoami命令。

ls;pwd;whoami

如果我没有正确理解你的问题,请纠正我。