무리를 짓기 위해 여러 명령을 전달


12
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

flock위의 예와 같이 여러 명령을 어떻게 전달 합니까?

내가 이해하는 한 flock다른 플래그 (배타적 인 경우 -x, 시간 초과의 경우 -w), 파일을 잠그고 실행할 명령을 사용합니다. 이 함수에 두 개의 명령을 전달하는 방법을 모르겠습니다 (파일 내용이 잠겨있는 변수를 설정 한 다음이 파일을 늘리십시오).

여기서의 목표는 스크립트가 counter.txt파일 에 액세스하려고 할 때마다 파일을 잠 그어 파일에 대해 약간의 원자 적 증가를 만드는 것 입니다.

답변:


8

쉘을 명시 적으로 호출하십시오.

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

변경 한 변수는 해당 셸 인스턴스에 대해 로컬입니다. 예를 들어, COUNTER변수는 호출 스크립트에서 업데이트되지 않습니다. 파일 에서 변수를 다시 읽어야하지만 (그 동안 변경되었을 수 있음) 명령의 출력으로 :

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')

정말 고마워요! 당신이 제공하는 설명은 확실히 두통의 또 다른 시간에서 저를 저장
D를 -_- b를

4

또는 파일 설명자를 모을 수 있습니다

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

또한 서브 쉘 기반 접근 방식과 달리 카운터 변수를 직접 사용할 수 있다는 이점이 있습니다.


설명해 주 exec {counterfd}시겠습니까? 자체적으로 Debian errors not found이지만 리디렉션과 함께 0을 반환합니다. 매우 이상합니다.
Steve Almond

2

flock도구는 사용하기가 약간 까다 롭고 매뉴얼 페이지는 매우 짧습니다. 매뉴얼 페이지는 도구를 사용하는 세 가지 방법을 제공합니다.

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

이 질문이 표현되는 방식은의 세 번째 형식을 분명히 사용합니다 flock. man 페이지에서 아래로 내려 가면 flock세 번째 양식을 사용하는 정확한 구문을 보여주는 몇 가지 예가 있습니다.

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

을 추가했습니다 #!/bin/bash.

이 형식을 성공적으로 사용했습니다 flock.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.