2017-10-15 14 views
0

나는 백그라운드에서 무한대로 실행되는 bash 스크립트에서 동일한 스크립트를 다시 실행하여 종료됩니다. 그것은 일종의 스위치입니다.이 스크립트를 호출 할 때 이미 실행 중이면 함수가 시작되거나 종료됩니다. 이렇게하려면 PID 파일을 사용합니다.PID 파일 잠그기

이제 여러 인스턴스가 실행되고 경쟁 조건이 발생하지 않도록하고 싶습니다. 그러나, 나는 다시 PID를 파일로 재 작성하는 스크립트를 실행 PID를 파일하지만, 모든 시간에 대한 잠금을 가지고 이렇게

#!/bin/bash 

background_function() { 
    ... 
} 

exec 200>myscript.pid 
if flock -n 200 
then 
    background_function & 
    echo $! > myscript.pid 
else 
    kill $(cat myscript.pid) && rm myscript.pid 
fi 

: 나는 무리를 사용하려하고 나는이 방법으로 위의 코드를 재 작성 exec 200>myscript.pid 그리고 이미 실행중인 인스턴스의 PID를 검색하고 죽일 수 없습니다.

어떻게해야합니까? 두 개의 서로 다른 파일 (pid 파일과 잠금 파일)을 사용해야합니까? 아니면 mkdir을 사용하여 다른 잠금 메커니즘을 구현하고 touch하는 것이 더 좋을까요? 감사. echo $$ 당신을 위해 충분히 원자 인 경우

답변

0

, 당신은 사용할 수 있습니다

echo $$ >> lock.pid 
lockedby=`head -1 lock.pid` 
if [ $$ != $lockedby ] ; then 
    kill -9 $lockedby 
    echo $$ > lock.pid 
    echo "Murdered $lockedby because it had the lock" 
fi 

# do things in the script 

rm lock.pid 
+0

그것은 흥미로운 접근 방식이다 그리고 그것은 나를 위해 작동합니다. 유일한 까다로운 부분은 백그라운드에서 프로세스의 올바른 PID로 PID 파일을 다시 쓰는 것입니다 ('background_function &; echo $!> lock.pid'). 고맙습니다! –