Randal L. Schwartz 는 2013 년 8 월 19 일, Linux에서 "경쟁 조건없이 또는 잠금 파일을 정리하지 않고 하나의 스크립트 인스턴스 만 실행되도록" 이 쉘 스크립트를 게시 했습니다 .
#!/bin/sh
# randal_l_schwartz_001.sh
(
if ! flock -n -x 0
then
echo "$$ cannot get flock"
exit 0
fi
echo "$$ start"
sleep 10 # for testing. put the real task here
echo "$$ end"
) < $0
광고 된대로 작동하는 것 같습니다.
$ ./randal_l_schwartz_001.sh & ./randal_l_schwartz_001.sh
[1] 11863
11863 start
11864 cannot get flock
$ 11863 end
[1]+ Done ./randal_l_schwartz_001.sh
$
내가 이해하는 것은 다음과 같습니다.
- 스크립트
<
는 자체 내용의 사본 (에서 from$0
)을0
서브 쉘 의 STDIN (예 : 파일 설명자 )으로 경로 재 지정합니다 ( ) . - 서브 쉘 내에서 스크립트는
flock -n -x
파일 디스크립터 에서 비 블로킹 독점 잠금 ( ) 을 가져 오려고 시도합니다0
.- 해당 시도가 실패하면 서브 쉘이 종료됩니다 (다른 작업이 없기 때문에 기본 스크립트도 종료 됨).
- 시도가 성공하면 서브 쉘이 원하는 태스크를 실행합니다.
내 질문은 다음과 같습니다.
- 스크립트가 왜 다른 파일 의 내용이 아닌 자체 내용 의 사본을 서브 쉘에 의해 상속 된 파일 디스크립터로 경로 재지 정해야 합니까? (다른 파일에서 리디렉션을 시도하고 위와 같이 다시 실행했는데 실행 순서가 변경되었습니다. 백그라운드되지 않은 작업이 백그라운드 작업보다 먼저 잠금을 얻었습니다. 따라서 파일 자체 내용을 사용하면 경쟁 조건을 피할 수 있습니다. 그러나 어떻게?)
- 어쨌든 스크립트가 서브 쉘이 상속 한 파일 디스크립터로 파일 내용의 사본을 경로 재지 정해야하는 이유는 무엇입니까?
0
한 쉘 에서 파일 디스크립터 에 독점 잠금을 유지하는 이유는 다른 쉘에서 실행되는 동일한 스크립트의 사본이 파일 디스크립터에 독점 잠금을 얻지 못하게하는 이유는 무엇0
입니까? 쉘은 표준 파일 기술자 (자신의 별도의 사본이없는0
,1
그리고2
, 즉, STDIN, STDOUT, 및 STDERR)를?