2016-06-10 86 views
1

我有一個執行備份的shell腳本。我在cron中設置了這個腳本,但問題是備份非常繁重,因此可能在第一次結束之前執行第二次rsync。 我想在腳本中啓動rsync,然後獲得PID並編寫一個腳本檢查進程是否存在的文件(如果此文件存在或不存在)。 如果我把rsync放在後臺,我得到了PID,但我不知道如何知道rsync何時結束,但是如果我設置了rsync(無後臺),那麼在進程結束之前我無法獲得PID,因此我無法寫入一個文件惠特PID。從shell腳本中獲取背景rsync和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 

任何人可以幫助我嗎?

在此先感謝! :)

+0

使用wait commamd – user2181624

+0

@ user2181624我不知道需要等多少時間:S我認爲不是最好的方法。 – jask

+0

你不需要知道需要等待多少時間。看到bash手冊頁(因爲它很長,(等待這個詞的時間似乎超過了幾十億次)轉到手冊頁的末尾,向後搜索'SHELL BUILTIN',然後向前搜索'wait'。 – Cwissy

回答

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發現的過程
  • -x告訴它來尋找腳本的PID太
  • $ {} sScriptName是腳本的只是名字......你可以硬編碼這個
  • 廁所,如果超過一個實例,然後運行退出腳本-w返回的話
  • -gt 2字數不超過一個實例上運行(例如加1爲的pidof檢查)

讓我知道這是否適合你。

+0

非常感謝@jgshawkey它的功能非常好!! :) – jask

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 

希望這有助於!

+0

聽起來不錯但我不明白這個腳本知道該進程何時完成 該腳本查找PID,但它不會刪除PID文件,所以總是會運行,不是嗎?謝謝! – jask

+1

@jask the腳本不會等待進程結束,但是,這裏的技巧是記錄上次啓動的腳本進程的PID和後續運行,只需檢查最後記錄的PID是否存在(ps -ef | grep $ previous_pid | wc -l)。如果最後一個進程仍在運行,腳本將退出而不會啓動新腳本,否則會啓動一個新腳本並記錄它的PID。 –