Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 简单bash脚本在作为cron作业运行时异步运行_Linux_Bash_Ssh_Cron - Fatal编程技术网

Linux 简单bash脚本在作为cron作业运行时异步运行

Linux 简单bash脚本在作为cron作业运行时异步运行,linux,bash,ssh,cron,Linux,Bash,Ssh,Cron,我编写了一个备份脚本,它将按以下顺序执行: 通过SSH在远程备份服务器上压缩文件 转储我的本地数据库 通过SSH rsync将我的本地数据库传输到备份服务器 现在,当我在RHEL中从命令行运行这个脚本时,它工作得非常好 但是当我将这个脚本设置为通过cronjob运行时,脚本确实会运行,但是从我所知道的,它不知何故同时运行上述3个命令。正因为如此,事情变得杂乱无章(在#1 zip作业实际完成之前,我的本地数据库已完成转储和传输) 有没有人遇到过这种奇怪的情况?作为最简单的修复,有没有办法强制脚本同

我编写了一个备份脚本,它将按以下顺序执行:

  • 通过SSH在远程备份服务器上压缩文件
  • 转储我的本地数据库
  • 通过SSH rsync将我的本地数据库传输到备份服务器
  • 现在,当我在RHEL中从命令行运行这个脚本时,它工作得非常好

    但是当我将这个脚本设置为通过cronjob运行时,脚本确实会运行,但是从我所知道的,它不知何故同时运行上述3个命令。正因为如此,事情变得杂乱无章(在#1 zip作业实际完成之前,我的本地数据库已完成转储和传输)

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

    EDIT我添加了备份脚本的示例版本。脚本的第二行似乎与脚本的第一行同时运行,因此虽然发出了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/
    

    除非您显式地使用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小时分号只允许在一行中使用多个不同的命令。与用换行符分隔脚本相比,它不会改变脚本的执行