Linux 简单bash脚本在作为cron作业运行时异步运行
我编写了一个备份脚本,它将按以下顺序执行:Linux 简单bash脚本在作为cron作业运行时异步运行,linux,bash,ssh,cron,Linux,Bash,Ssh,Cron,我编写了一个备份脚本,它将按以下顺序执行: 通过SSH在远程备份服务器上压缩文件 转储我的本地数据库 通过SSH rsync将我的本地数据库传输到备份服务器 现在,当我在RHEL中从命令行运行这个脚本时,它工作得非常好 但是当我将这个脚本设置为通过cronjob运行时,脚本确实会运行,但是从我所知道的,它不知何故同时运行上述3个命令。正因为如此,事情变得杂乱无章(在#1 zip作业实际完成之前,我的本地数据库已完成转储和传输) 有没有人遇到过这种奇怪的情况?作为最简单的修复,有没有办法强制脚本同
#!/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/
除非您显式地使用background(&),否则一切都应该一个接一个地运行,直到前面的完成。 也许你真的看到了cron之前的重复执行?如果是这样,可以通过使用flock调用脚本来防止多次执行 e、 g.午夜cron从 0***backup.sh 到
0 0***flock-n/tmp/backup.lock-c backup.sh如果要按顺序运行命令,可以使用运算符 -分号运算符 该操作员一次运行多个命令,但按顺序运行。如果我们使用三个以分号分隔的命令,则第二个命令将在第一个命令完成后运行,第三个命令将仅在第二个命令执行完成后运行。我们应该知道的一点是,要运行第二个命令,它并不取决于第一个命令的退出状态 在一行中依次执行ls、pwd、whoami命令
ls;pwd;whoami
如果我没有正确理解你的问题,请纠正我。脚本的这三行是否都以一个符号和结尾?你能在你的问题中包括确切的脚本以及cron条目吗?你能分享你的脚本吗。@jwpat7我编辑了这篇文章来添加我的示例脚本@Ekrike的多次重叠执行想法可能是正确的,但我们无法从提供的信息中判断。可能包括问题中的一个或多个cron条目。此外,您还可以创建一个名为
tellprogress
的脚本,并在上面的脚本中,在您认为重叠的任何命令之前和之后添加对tellprogress
的调用。在tellprogress
中,报告当前日期和时间,以及pgrep tar
或pgrep ssh
(或ps aux | egrep'tar | ssh'
如果未安装pgrep
等的结果–即,检测问题以获得足够的信息进行调试it@jwpat7有问题的条目是前两个(ssh和mysqldump)。在我看来,ssh实际上是个问题,因为它似乎是从脚本的其余部分异步运行的。ssh命令被触发(实际完成大约需要40分钟),但在ssh命令发送后,mysqldump立即开始。我有一种感觉,ssh命令仅仅通过调用命令就向cron脚本返回了某种“成功”,而且它实际上并不等待在运行到anks之前完成,我认为它们不会重叠,因为cron作业每天运行一次,运行作业总共需要1小时分号只允许在一行中使用多个不同的命令。与用换行符分隔脚本相比,它不会改变脚本的执行