최근에 다른 스크립트가 실행되었을 때만 실행되는 스크립트를 작성하는 방법은 무엇입니까?

최근에 다른 스크립트가 실행되었을 때만 실행되는 스크립트를 작성하는 방법은 무엇입니까?

두 개의 스크립트를 작성하려고 합니다. 하지만 두 번 연속으로 실행되는 것을 방지하려고 하면 문제가 발생합니다. 예를 들어 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

비록 빠르고 지저분하더라도 이것은 당신에게 좋습니다.

관련 정보