bash 스크립트의 인스턴스가 하나만 실행되도록 하는 방법은 무엇입니까?

bash 스크립트의 인스턴스가 하나만 실행되도록 하는 방법은 무엇입니까?

추가 도구가 필요하지 않은 솔루션이 선호됩니다.

답변1

nsg의 답변과 거의 유사합니다. 잠금을 사용하세요.목차. 디렉토리 생성은 linux, unix, *BSD 및 기타 여러 운영 체제에서 원자적으로 이루어집니다.

if mkdir -- "$LOCKDIR"
then
    # Do important, exclusive stuff
    if rmdir -- "$LOCKDIR"
    then
        echo "Victory is mine"
    else
        echo "Could not remove lock dir" >&2
    fi
else
    # Handle error condition
    ...
fi

디버깅 목적으로 잠금 sh의 PID를 잠금 디렉토리의 파일에 넣을 수 있지만 PID를 확인하여 잠금 프로세스가 여전히 실행 중인지 확인할 수 있다고 생각하는 함정에 빠지지 마십시오. 그 과정에는 많은 경쟁 조건이 있습니다.

답변2

추가하다브루스 에디거의 답변, 그리고 영감을 받아이 답변, 스크립트가 종료되는 것을 방지하려면 정리에 더 많은 지능을 추가해야 합니다.

#Remove the lock directory
cleanup() {
    if rmdir -- "$LOCKDIR"; then
        echo "Finished"
    else
        echo >&2 "Failed to remove lock directory '$LOCKDIR'"
        exit 1
    fi
}

if mkdir -- "$LOCKDIR"; then
    #Ensure that if we "grabbed a lock", we release it
    #Works for SIGTERM and SIGINT(Ctrl-C) as well in some shells
    #including bash.
    trap "cleanup" EXIT

    echo "Acquired lock, running"

    # Processing starts here
else
    echo >&2 "Could not create lock directory '$LOCKDIR'"
    exit 1
fi

답변3

bash 스크립트의 단일 인스턴스가 실행 중인지 확인하는 또 다른 방법은 다음과 같습니다.

#! /bin/bash -

# Check if another instance of script is running
if pidof -o %PPID -x -- "$0" >/dev/null; then
  printf >&2 '%s\n' "ERROR: Script $0 already running"
  exit 1
fi

...

pidof -o %PPID -x -- "$0"기존 스크립트가 이미 실행 중이면 해당 PID를 가져오고, 다른 스크립트가 실행 중이 아니면 오류 코드 1로 종료합니다.


¹ 글쎄요, 같은 이름을 가진 모든 프로세스는...

답변4

너무 간단할 수도 있으니, 틀렸다면 정정해 주세요. 충분히 간단하지 않습니까 ps?

#!/bin/bash 

me="$(basename "$0")";
running=$(ps h -C "$me" | grep -wv $$ | wc -l);
[[ $running > 1 ]] && exit;

# do stuff below this comment

관련 정보