来自 shell 脚本的后台 rsync 和 pid

Background rsync and pid from a shell script

我有一个执行备份的 shell 脚本。我在 cron 中设置了这个脚本,但问题是备份很重,因此可以在第一次 rsync 结束之前执行第二次 rsync。 我想在脚本中启动 rsync,然后获取 PID 并编写一个文件,脚本检查进程是否存在(如果该文件存在或不存在)。 如果我将 rsync 置于后台,我会得到 PID,但我不知道如何知道 rsync 何时结束,但是,如果我设置 rsync(无背景),我无法在进程完成之前获得 PID,所以我无法编写文件白衣PID。

我不知道去 "have rsync control" 的最佳方式是什么,也不知道什么时候结束。

我的脚本

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

有人能帮帮我吗?!

提前致谢!! :)

像这样测试 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

希望对您有所帮助!!!

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

sScriptName="$(basename [=10=])"

if [ $(pidof -x ${sScriptName}| wc -w) -gt 2 ]; then 
    exit
fi
  • pidof 查找进程的 pid
  • -x 告诉它也要查找脚本
  • ${sScriptName} 只是脚本的名称...您可以对其进行硬编码
  • wc -w returns 字数
  • -gt 2 不超过1个实例运行(实例加1用于pidof检查)
  • 如果不止一个实例运行然后退出脚本

让我知道这是否适合你。