두 개의 스크립트를 작성하려고 합니다. 하지만 두 번 연속으로 실행되는 것을 방지하려고 하면 문제가 발생합니다. 예를 들어 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"를 읽고 "date" 파일 사이를 이동하여 날짜를 비교할 수 있습니다. 스크립트 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
비록 빠르고 지저분하더라도 이것은 당신에게 좋습니다.