알고리즘과 언어/shell(bash)

스크립트 중복 실행 방지

nextcoder 2022. 6. 20. 20:24

 

a.sh 에서 b.sh의 스크립트 중복 실행을 방지하기 위해서는 ps -ef | grep b.sh | grep -v | wc -l 값이 1 이상인지를 통해서

b.sh 가 실행되고 있는지를 확인하면 되겠지만

a.sh에서 a.sh 스스로가 중복실행되는지를 체크하기 위해서는 위와 같은 방법으로 확인하기 어렵다.

 

1. a.sh 스크립트에서 동명의 a.sh가 실행되는지를 확인하기 위해서 ps -ef를 한다면, 본인도 세어지기 때문에 0인지 아닌지로 체크할 수 없음.

2. 실제로 선행되는 a.sh가 없는 경우에 ps -ef를 통해 기준을 잡으려고 했지만, 1이 나올 것이라는 기대와 달리 3이 나왔음. (2였으면 ps -ef가 실행되는 커맨드의 자식 프로세스까지 세어졌다고 생각할 수 있겠지만, 3이 나오는 경우도 존재했고, 인터넷을 통해 해답을 찾기 어려웠다.)

 

결론적으로는 lock파일을 만들어서, a.sh가 실행된다면 락파일을 생성하고 자신의 pid를 적은 후 쉘 스크립트의 내용이 진행되도록 하고 , 

쉘이 끝날 때 lcok파일을 지워서 다른 파일이 허용 가능하게 만들었다.

만일 a.sh가 실행중엔데 a.sh를 실행한다면 이미 락파일이 존재하기 때문에 종료된다.

 


# PATH는 락파일을 둘 경로. alias 할 수 있기에 되도록 절대경로를 적자
LOCKFILE=$PATH/lockfile
 
 # 락파일이 존재한다면 
        if [ -f $LOCKFILE ];then
        		# 안의 내용(PID) 확인
                P=`cat $LOCKFILE`
                # PID가 존재한다면 이미 동명의 스크립트가 존재하므로 exit
                if [ -n "`ps --no-headers -f $P`" ];then
                        echo "already running "
                        exit 1
                fi
        fi
        # PID를 락파일에 쓴다. (+ 락파일 생성)
        echo $$ > $LOCKFILE
        # 쉘 스크립트가 꺼질 때, 락파일을 삭제해라
        trap "rm -f $LOCKFILE" EXIT


# 실제 코드
# main code .....