目前我正在尝试这样做:
所以,可能会发生的事情是,例如每天和每周将在同一天运行。由于应备份的文件被其他备份进程锁定,因此至少其中一个将失败。所以,一个简单的解决方案是在不同的时间运行作业。但是既然我们不能确切地说工作需要多长时间,那就太难看了。
所以我在考虑的是一个代理脚本,所以我不会做上面的cron工作,而是会做类似
的事情。那么我唯一关心的是他们随时都会偏移,所以他们不会互相阻挡。也应该明智地选择“等待”时间,以便他们不会在同一时刻“重新检查”并再次相互阻止(有3个过程我们可以使用每周过程的偏移+1,每月过程+2和偶数/不均匀计数器重新检查时间)
然而,我不知道如何用linux脚本实现这一点。我不确定“正确”的程序是什么。使用在进程启动时创建的锁文件并检查?如果它被锁定会发生什么?是时候使用睡眠并在时间X后再次检查锁定文件的“好”方法?我不确定当我在linux线程上使用睡眠时会发生什么 - 我的意思是:“计数器”是否被安排并耗尽处理器电源或是否有某种中断,处理器将在一段时间后发送给进程X(比如“基于事件”?) 有没有你能想到的更好的方法?一些linux脚本代码片段将是完美的,因为那不是我之前做过的事情
答案 0 :(得分:6)
我会将所有三个脚本合并为一个具有不同参数的脚本。像do_backup.sh daily
一样。
您使用相同的锁文件是正确的。我会更进一步,在这个锁文件中写入你的进程PID。这样,如果您的进程看到锁存文件存在,它不仅会拯救,而是检查创建此文件仍在运行的进程。这种方式即使您的进程崩溃并且没有删除锁定文件 - 您的整个系统仍然是安全的。
以下是我在脚本中使用的示例,以确保只有一个副本同时运行:
#!/bin/sh
PID_FILE=$0.pid
[ -f $PID_FILE ] && {
pid=`cat $PID_FILE`
ps -p $pid && {
echo Already running...
exit
}
rm -rf $PID_FILE
}
echo $$ > $PID_FILE
然后在你的脚本中你只需要包含这个文件
source pid.sh