2013-07-07 3 views
1

ftp 서버에 파일을 업로드하는 "wp"라는 작은 bash 스크립트를 작성했습니다. wput 유틸리티를 사용합니다. 텍스트 파일에서 파일 목록을 가져옵니다. 업로드가 준비되면 텍스트 파일에서 이중 십자가가있는 행을 주석 처리합니다. 업로드 성공 여부는 로그 파일의 마지막 줄에 따라 감지됩니다. 제 질문은 어떻게 스크립트를 여러 번 시작하지 않도록 할 수 있습니까? 나는 인스턴스가 실행중인 경우 pgrep을 함께 감지하려고하지만 제대로 작동하지 않습니다bash 스크립트를 여러 번 시작하지 않으려면 어떻게해야합니까?

#!/bin/bash 

if [ "$(pgrep ^wp$|wc -l)" -eq "2" ] 

then 
    echo "$(pgrep ^wp$)" 
    echo "$(pgrep ^wp$|wc -l)" 
    echo "wp script is starting..." 
else 
    echo "$(pgrep ^wp$)" 
    echo "$(pgrep ^wp$|wc -l)" 
    echo "wp script is already running!" 
    exit 
fi 

server="ftp://username:[email protected]" 
logfile=~/uploads.log 
listfile=~/uploads.txt 
list_backup=~/uploads_bak000.txt 

while read f; 
do 
ret="" 

if [ "${f:0:1}" = "#" -o "$f"1 = 1 ] 
then 
    if [ "$f"1 = 1 ] 
    then 
    : 
    #echo "invalid string: "$f 
    else 
    #first character is remark sign # then empty command -> : 
    echo "remark line skipped: "$f 
    fi 
else 
    #while string $ret is empty 
    while [ -z "$ret" ] 
    do 
    wput "$f" --tries=-1 "$server" 2>&1|tee -a $logfile #> /dev/null 
    ret=$(tail -n 1 "$logfile"|grep "FINISHED\|Nothing\|Skipped\|Transfered") 
    done 
    if [ -n "$ret" ] 
    then 
    cat $listfile > $list_backup 
    awk -v f="$f" '{if ($0==f && $0!~/#/) print "#" $0; else print $0;}' $list_backup > $listfile 
    fi 
fi 
done < $listfile 

답변

2

는 그렙 (이 작업을 수행하지 않음)에 PS를 사용하여 빠른 앤 더러운 솔루션이 있습니다.

잠금 파일을 "뮤텍스"로 사용하는 것이 좋습니다. 이 작업을 수행하는 좋은 방법은 디렉토리를 잠금 파일 (http://mywiki.wooledge.org/BashFAQ/045)로 사용하는 것입니다. 당신을 위해 처리 잠금 파일을 추상화하는 setlock (http://cr.yp.to/daemontools/setlock.html)의 사용을 언급 http://mywiki.wooledge.org/ProcessManagement#How_do_I_make_sure_only_one_copy_of_my_script_can_run_at_a_time.3F :

은 또한 한 번 봐 복용 제안합니다.

+0

Thx/tmp에 emtpy 디렉토리를 만들면 문제가 해결됩니다. 내 스크립트의 끝에서 삭제되어야한다고 생각하지만 스크립트가 Ctrl + C로 중단되고 다시 시작하려면 어떻게해야합니까? 잠금 디렉토리가 있기 때문에 시작되지 않습니다. – Konstantin

+0

@Konstantin, BashFAQ 링크를 읽어야합니다. 대답은 거기에 있습니다. –

+1

@ Constantin : 신호가 포착 된 후 rm이 실행되도록하려면 trap 명령을 사용해야합니다. 그러나 Glenn이 말했듯이 : BashFAQ의 나머지 부분을 읽으십시오. 여기에는 다른 접근법보다 mkdir을 사용해야하는 이유에 대한 좋은 설명, 고려해야 할 남아있는 부실한 자물쇠 위험에 대한 언급 (kill -9의 경우) 및 여러분이 리눅스에있다. – kamjagin

관련 문제