ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스크립트 중복 실행 방지
    알고리즘과 언어/shell(bash) 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 .....

     

     

     

Designed by Tistory.