在与Cron一起前往下一行之前等待shell脚本完成

时间:2011-12-12 20:27:13

标签: cron wait tar scp gz

---文件makebackup.sh

#!/bin/bash
mysqldump --all-databases | gzip -9 > /backup/temp_db.gz
tar -Pcf /backup/temp_ftp.tar /public_html/
tar -Pcf /backup/temp_backup.tar /home/temp_db.gz /backup/temp_ftp.tar
wait %%
/backup/upload.sh

--- file upload.sh

#!/usr/bin/expect -f

# connect via scp
spawn scp /backup/temp_backup.tar root@mybackup.com:/home/backup.tar
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "mypassword\r"
}
}
interact

当我查看/backup文件夹时,我看到所有文件都在那里。尺寸合适 当我查看目标站点时,我看到的文件比我在/backup文件夹中的源服务器中的文件少18倍。

当我将它作为./makebackup.sh运行时,当我通过cron运行时它没有正常工作。一旦先前的命令完成,有没有办法执行backup/upload.sh ONLY

15 12 * * 1,3,5 /backup/makebackup.sh 2>&1 >> /var/log/cron_makebackup.log

除非我手动运行,否则Cron日志在其他地方没有说什么。

1 个答案:

答案 0 :(得分:1)

我不知道wait %%的作用,但这应该会有所帮助:

#!/bin/bash
mysqldump --all-databases | gzip -9 > /backup/temp_db.gz
tar -Pcf /backup/temp_ftp.tar /public_html/
tar -Pcf /backup/temp_backup.tar /home/temp_db.gz /backup/temp_ftp.tar && \  
/backup/upload.sh || \
/backup/upload.sh

注意:永远不要忘记您可以设置scp(以及ssh} to work without passwords!我会考虑代替expect(这是一个很棒的工具)。

这种方式只有在最后一个tar命令成功完成或错误退出代码完成后才会执行upload.sh

更多信息:

  • 如果您编写test && command,则只有在测试成功时才会执行command
  • 如果您编写test || command,则只有在测试失败时才会执行command

运行这些测试:

$ true && echo "Yes."
Yes.
$ false || echo "Yes."
Yes.

请注意,结果完全符合一个人对这种逻辑比较的直觉,只要你没有考虑到真等于0.的事实,一切都很好。:) 这是shell脚本编程和交互式会话中常见的另一种方案:

$ command1 && command2 && command3 && command4

除非先前的命令返回“true”,否则这行代码不会运行序列中的下一个命令,这意味着没有错误。如果不存在所需的先前结果,这是避免运行命令的一种方法。

另请参阅&&上的this article||测试。

HTH