
두 개의 스크립트를 작성하려고 합니다. 하지만 둘 중 하나가 연속으로 두 번 실행되는 것을 방지하려고 하면 문제가 발생합니다. 예를 들어 script1과 script2가 있습니다. 마지막으로 script1을 실행한 이후 script2가 실행된 경우에만 script1을 실행할 수 있기를 원합니다. 어떤 아이디어가 있나요?
답변1
스크립트 A에서 특정 파일이 있는지 확인하고, 없으면 /tmp 디렉터리(예: touch /tmp/script.lock
)에 있는 파일을 터치하여 코드를 실행합니다. 그런 다음 스크립트 B에서 파일이 존재하는지 확인하십시오. 파일이 있으면 스크립트 본문을 실행한 후 나중에 파일을 삭제하세요.
스크립트 A:
if [ ! -f /tmp/script.lock ]
then
echo hello
touch /tmp/script.lock
fi
스크립트 B:
if [ -f /tmp/script.lock ]
then
echo hello
rm /tmp/script.lock
fi
답변2
각 스크립트가 특정 파일(예 /var/tmp/script1-2
: )을 확인하도록 합니다.
검사 파일이 없으면 가능한 한 빨리 다른 스크립트의 이름을 파일에 기록하여 이 스크립트가 실행되는 동안 해당 스크립트가 실행되지 않도록 하세요.
존재하고 자체 이름이 포함되어 있으면 종료하십시오. 그렇지 않으면 정상적으로 실행됩니다.
종료하기 직전에 각 스크립트는 파일에 고유한 이름을 써야 합니다.
CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1
# rest of script here
.
.
echo "$MYNAME" > "$CHECKFILE"
옵션 grep
은 다음과 같습니다:
-q
조용함을 위해 출력을 생성하지 않음-w
전체 단어만 일치하는 경우-F
정규 표현식이 아닌 고정 문자열을 일치시키기 위한 것입니다.
참고: 두 스크립트가 모두 실행되는 경우정확히동시에 $CHECKFILE이 아직 존재하지 않으면 둘 다 실행됩니다. 마지막으로 완료되는 항목(실행하는 데 더 많은 시간이 소요됨)은 $CHECKFILE에 해당 이름이 기록됩니다. 이를 방지하려면 echo script2 > /var/tmp/script1-2
둘 중 하나를 실행하기 전에 실행하십시오.
답변3
한 가지 옵션은 스크립트 1 내에서 "date" 명령을 실행하고 이 출력을 "file.txt"와 같은 일부 파일로 리디렉션하는 것입니다. 그런 다음 스크립트 2는 이 "file.txt"를 읽고 이 사이의 "날짜" 비교를 수행할 수 있습니다. 날짜와 스크립트 2가 실행된 날짜는 무엇입니까? "날짜" 비교는 상대적으로 쉬울 것입니다. 웹에는 많은 예가 있습니다. 생각할 거리.
(요구 사항에 따라) 또 다른 옵션은 물론 "cron" 작업 항목을 추가하는 것입니다.
답변4
이전에 script2가 실행되었는지 여부를 알고 싶다면 다음을 수행하세요.
script2에서는 어디에서나 수행할 수 있습니다.
touch .ran_already
.
이제 script1에서 다음을 수행하십시오.
if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi
비록 빠르고 지저분하기는 하지만 이것은 당신에게 좋은 도움이 될 것입니다.