2011-12-12 89 views
0

完成---文件makebackup.sh等待shell脚本才去下一行通过计划

#!/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 

---文件upload.sh

#!/usr/bin/expect -f 

# connect via scp 
spawn scp /backup/temp_backup.tar [email protected]:/home/backup.tar 
####################### 
expect { 
-re ".*es.*o.*" { 
exp_send "yes\r" 
exp_continue 
} 
-re ".*sword.*" { 
exp_send "mypassword\r" 
} 
} 
interact 

我看到所有文件都在那里。在适当的大小 当我看到目标网站时,我看到的文件比源文件夹中的源服务器的文件少18倍。

当我只是运行它作为./makebackup.sh它运作正常时,我运行槽cron它没有。有没有办法执行backup/upload.sh只有先前的命令完成后?

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

当我手动运行它时,Cron日志不会说任何其他内容。

回答

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(这是一个伟大的工具)。

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

一些更多的信息:

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

运行这些测试:

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

注意,结果是完全符合有关这种逻辑比较一个人的直觉一致,一切都很好,只要你不认为有关的事实,真正的等于0 :) 下面是shell脚本编程和互动环节常见的另一种方案:

$ command1 && command2 && command3 && command4 

这行代码不会,除非序列中运行的下一个命令先前的命令已经返回“真”,意味着没有错误。如果没有必要的预先结果,这是一种避免运行命令的方法。

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

HTH

+0

wait %%据说等待上次触发PID完成。你能告诉我这个&& \,|| \技术叫所以我可以找到更多的信息呢? – JohnA

+0

这没有奏效。 – JohnA

+0

你的意思是没有工作? –