2012-09-25 3 views
-1

도움이 필요합니다. 나는 '스크립트 1'이라는 스크립트를 가지고 있는데,이 스크립트는 백그라운드에서 실행되는 '스크립트 2'를 호출하여 주기적으로 무언가를 확인합니다. 하지만 Script 2를 한 번만 시작하고 Script 1을 여러 번 호출하기를 원합니다. 그것을 할 수있는 방법이 있습니까?스크립트에서 한 번만 명령 실행, 심지어 여러 번 스크립트 실행

누군가가 이것을 달성하기 위해 몇 가지 명령을 제안하면 더 도움이 될 것입니다.

if [[ -f /tmp/Script2HasRun ]] ; then 
    exit 
fi 
touch /tmp/Script2HasRun 

하지 않는 한 감시 파일을 사용하여 다시 실행 에서 Script2을 중지 할 것 : 사전에

감사

+0

가능한 중복 [쉘 스크립트를 해당 스크립트가 이미 실행중인 경우 실행되지 않습니다 확인] (http://stackoverflow.com/questions/4768860/shell-script-ensure-that-script-isnt-executed-if- 이미 실행)의 –

+0

중복 : http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only-one-instance-of-a-shell-script-is-running- –

답변

1

물론, 당신은 Script2의 상단에 이런 식으로 뭔가를 넣을 수 있습니다 파일은 물론 삭제되며 /tmp에 있기 때문에 어느 시점에있을 것입니다.

그래서 더 잘 보호 할 수있는 곳에 다른 곳에두기를 원할 것입니다.

을 실행하지 않으려면을 다시 실행하지 않으려면 센티넬 파일을 삭제하는 방법이 필요합니다. 의도 한 번에 실행 한 사본을 가지고있는 경우

예를 들어, :

if [[ -f /tmp/Script2IsRunning ]] ; then 
    exit 
fi 
touch /tmp/Script2IsRunning 
# Do whatever you have to do. 
rm -f /tmp/Script2IsRunning 

을 그리고 명심 는 두 개의 사본에 결과가 실행 수있다 경쟁 조건이있다.

if [[ -f /tmp/Script2IsRunning ]] ; then 
    exit 
fi 
echo $$ >/tmp/Script2IsRunning 
sleep 1 
if [[ "$(cat /tmp/Script2IsRunning 2>/dev/null)" != $$ ]] ; then 
    exit 
fi 
# Do whatever you have to do. 
rm -f /tmp/Script2IsRunning 

가 그 이상 보호의 더 수준은하지만 그들은 복잡하고, 나는 보통 그 대부분의 것들에 대한 충분 찾을 :이 뭔가 같은 것을 완화 할 수있는 방법뿐만 아니라으로 콘텐츠를 사용뿐만 아니라 존재입니다 . 의

+0

감사합니다. 많은 paxdiablo. 이 답변은 매우 유용합니다, 그것은 내 문제를 해결합니다. :) – iMSivam

관련 문제