2012-06-24 100 views
4

目前,我試圖做這樣的事情:製作cron作業等到另一個作業完成

  • 1 cron作業backup_daily
  • 2 cron作業backup_weekly
  • 3 cron作業backup_monthly

因此,可能發生的情況是,例如每天和每週將在同一天運行。至少其中一個將會失敗,因爲應備份的文件被另一個備份進程鎖定。所以,一個簡單的解決方案就是在不同的時間運行這些工作。但是由於我們不能說無所事事需要多長時間,這有點難看。

所以,我在想是一個代理腳本,所以不是做好上面的cron作業我會做類似

  • 1 cron作業check_if_anybackup_is_running_and_run_backup_daily_else_wait_till_finished
  • 2 cron作業check_if_anybackup_is_running_and_run_backup_weekly_else_wait_till_finished
  • 3的cron job check_if_anybackup_is_running_and_run_backup_monthly_else_wait_till_finished

那麼我唯一會關心的是他們從任何時間的偏移開始,所以他們不會彼此阻塞。也應該明智地選擇「等待」時間,以便他們不會在同一時間再次「重新檢查」並阻止彼此(有3個過程,我們可以每週使用+1偏移量進行處理,+ 2個處理每月和偶數/不均勻計數器重新檢查時間)

但是,我不知道如何實現這與一個Linux腳本。我不確定什麼是「正確」的程序。使用在進程啓動時創建的鎖文件並檢查?如果它被鎖定會發生什麼?在X時間之後再次檢查鎖文件是否是一種「好」的方法?我不確定當我在Linux線程上使用睡眠時會發生什麼 - 我的意思是:「計數器」是預定的並使用了處理器電源,還是有一些中斷,處理器將在一段時間後發送給進程X(如「基於事件」?) 有沒有更好的方法可以想到?一些Linux腳本代碼片段將是完美的,因爲那不是我以前做過的事情

+1

最常見方式是使用鎖定文件。如果它存在紓困(或等待並再試一次),更智能的變體確實存在。 「睡在Linux線程上」:你是什麼意思?睡眠(3)不花費(cpu)資源,該進程在睡眠系統調用中被阻塞,直到被喚醒或中斷。 – wildplasser

+0

是的,這就是我的意思。問題是如果它像一個真正的睡眠,進程處於非活動狀態並被CPU喚醒,或者進程啓動了一個計數器,那麼進程(計數器)確實需要cpu能力。很高興知道它不是那樣。你可能有任何片段或鏈接到好的bash腳本教程? – masi

回答

5

我會將所有三個腳本合併成一個具有不同參數的腳本。像do_backup.sh daily

你對使用相同的鎖定文件是正確的。我會走得更遠,並在此鎖文件中寫入您的進程PID。這樣,如果你的進程看到lockfile存在,它不僅僅是保護,而是檢查創建這個文件的進程是否還在運行。這種方式即使你的進程崩潰並且不會刪除鎖文件 - 你的整個系統仍然是安全的。

下面是示例我在腳本中使用,以確保只有一個副本在同一時間運行:

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

似乎合法。關於PID的好主意,會隨之而來。 – masi