shell脚本

时间:2016-06-10 13:09:05

标签: linux bash shell rsync

我有一个执行备份的shell脚本。我在cron中设置了这个脚本,但问题是备份很重,所以可以在第一个rsync开始之前执行第二个rsync。 我想在脚本中启动rsync然后获取PID并编写一个脚本检查进程是否存在的文件(如果该文件存在与否)。 如果我把rsync放在后台我得到PID,但我不知道如何知道rsync什么时候结束但是,如果我设置rsync(没有后台)我在进程结束之前无法获得PID所以我可以& #39; t写一个文件白衣PID。

我不知道什么是最好的方式来实现rsync控制"并知道它什么时候结束。

我的脚本

#!/bin/bash
pidfile="/home/${USER}/.rsync_repository"

if [ -f $pidfile ];
then
        echo "PID file exists " $(date +"%Y-%m-%d %H:%M:%S")
else
        rsync -zrt --delete-before /repository/ /mnt/backup/repositorio/ < /dev/null &
        echo $$ > $pidfile
        # If I uncomment this 'rm' and rsync is running in background, the file is deleted so I can't "control" when rsync finish
        # rm $pidfile 
fi

任何人都可以帮助我吗?!

提前致谢!! :)

2 个答案:

答案 0 :(得分:1)

测试pid文件的存在和正在运行的进程的状态,如下所示:

 #!/bin/bash

 pidfile="/home/${USER}/.rsync_repository" 
 is_running =0

 if [ -f $pidfile ];
 then
    echo "PID file exists " $(date +"%Y-%m-%d %H:%M:%S")
    previous_pid=`cat $pidfile`
    is_running=`ps -ef | grep $previous_pid | wc -l` 
 fi

 if [ $is_running -gt 0 ]; 
 then
    echo "Previous process didn't quit yet"
 else
    rsync -zrt --delete-before /repository/ /mnt/backup/repositorio/ < /dev/null &
    echo $$ > $pidfile
 fi

希望这有帮助!!!

答案 1 :(得分:1)

# check to make sure script isn't still running
# if it's still running then exit this script

sScriptName="$(basename $0)"

if [ $(pidof -x ${sScriptName}| wc -w) -gt 2 ]; then 
    exit
fi
  • pidof找到进程的pid
  • -x告诉它也要查找脚本
  • $ {sScriptName}只是脚本的名称...您可以对此进行硬编码
  • wc -w按字词
  • 返回字数
  • -gt 2不超过一个实例运行(实例加1为pidof检查)
  • 如果有多个实例正在运行,则退出脚本

请告诉我这是否适合您。