为了避免这类异常的发生我们仅需要在rsync的脚本里加一个进程锁,脚本在执行rsync同步之前会检测进程锁是否存在,如果存在则不再执行同一个rsync同步命令。
未加进程锁的脚本:
[[email protected] opt]# cat lra.sh #!/bin/sh rsync -avzP --bwlimit 3000 /home/lra [email protected]::abc --password-file=/etc/rsync.pasCrontab 里的计划任务
2 * * * * /opt/lra.sh > /dev/null
以上说明每两分钟执行一次lra.sh脚本,如果lra.sh的同步未在2分钟之内完成,crontab接下来的还会执行此脚本,这样就会产生相同的rsync的进程。
按照这种状态,长时间就会产生上百甚至上千个rsync进程,就会导致服务器的负载过高,甚至一些服务也会出现异常!
添加进程锁的脚本:
[[email protected] opt]# cat lra.sh #!/bin/sh flock -xn /var/run/rsync.lock -c 'rsync -avzP --bwlimit 3000 /home/lra [email protected]::abc --password-file=/etc/rsync.pas'Crontab 里的计划任务
2 * * * * /opt/lra.sh > /dev/null执行rsync同步命令前添加rsync的进程锁,会在 /var/run/目录下产生一个rsync.lock的锁文件,crontab执行lra.sh脚本,rsync会检测rsync.lock的锁文件是否存在,如果存在说明之前的同步还未完成,则不执行本次的rsync同步,直到上次rsync同步完成后,crontab里的脚本才会执行rsync同步。
很简单有木有?以前都是在php或者python中模拟加进程锁,没有这种方式简单。