추가 도구가 필요하지 않은 솔루션이 선호됩니다.
답변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