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
Thx/tmp에 emtpy 디렉토리를 만들면 문제가 해결됩니다. 내 스크립트의 끝에서 삭제되어야한다고 생각하지만 스크립트가 Ctrl + C로 중단되고 다시 시작하려면 어떻게해야합니까? 잠금 디렉토리가 있기 때문에 시작되지 않습니다. – Konstantin
@Konstantin, BashFAQ 링크를 읽어야합니다. 대답은 거기에 있습니다. –
@ Constantin : 신호가 포착 된 후 rm이 실행되도록하려면 trap 명령을 사용해야합니다. 그러나 Glenn이 말했듯이 : BashFAQ의 나머지 부분을 읽으십시오. 여기에는 다른 접근법보다 mkdir을 사용해야하는 이유에 대한 좋은 설명, 고려해야 할 남아있는 부실한 자물쇠 위험에 대한 언급 (kill -9의 경우) 및 여러분이 리눅스에있다. – kamjagin