함정 : bash 스크립트를 더 강력하게 만들기

전국 네트워크 서핑을하다가 흥미로운 기사 (완벽하게 설명되어 있기 때문에 여기에 텍스트로 가져 왔습니다) 저자가 다음을 사용하여 Bash 스크립트를 더 강력하게 만드는 방법을 보여줍니다. 트랩.

트랩을 사용하여 bash 스크립트를 더 강력하게 만들기

매일 XNUMX 시간마다 실행되는 bash 스크립트가 있고 어떤 시점에서 충돌하거나 동일한 스크립트가 동시에 두 번 실행된다고 상상해보십시오. 이 두 가지 상황은 수정을 위해 사람의 개입이 필요하거나 특정 시간에 해결할 수 없어 시스템이 일관되지 않은 상태로 남아 있기 때문에 매우 불편합니다. 이에 대한 해결책은 무엇보다도 트랩을 사용하는 것입니다.

트랩은 bash 스크립트의 출력을 제어하는 ​​간단하고 효과적인 방법입니다. 동일한 초기 상황으로 돌아가 보겠습니다. 스크립트가 수동으로 중지되면 (예 : ctrl-c 사용) 중단되어 출력 신호를 반환합니다.

INT

그리고 그것이

kill

그러면 출력은

TERM.

가능한 모든 종료 코드는

kill -l

그러나 가장 많이 사용되는 것은

INT, 기간, 종료

예를 들어 스크립트가 다음과의 파일 동기화로 구성된 경우

rsync

가장 현명한 방법은 스크립트가 동시에 실행되는 것을 허용하지 않는 잠금 파일에 의존하는 것입니다.

LOCK = "/ var / run / rsync.lock"if [! -e $ 잠금]; 그런 다음 $ LOCK rsync -avz foo bar rm $ LOCK else echo "rsync가 이미 실행 중입니다"fi

일반 스페인어로 위의 스크립트는 잠금 파일이 존재하는지 확인하고 존재하지 않는 경우 해당 파일을 생성 한 다음 해당 명령을 실행하고 마지막으로 잠금 파일을 삭제합니다. 파일이 있으면 스크립트는 명령이 이미 실행 중임을 나타내는 메시지를 사용자에게 보냅니다.

그러나 문제가있는 상황이 발생하면 잠금 파일이 제거되지 않아 원치 않는 효과가 손상 될 수 있습니다. 해결책은 매우 간단합니다.

LOCK = "/ var / run / rsync.lock"if [! -e $ 잠금]; then trap "rm -f $ LOCK; exit"INT TERM EXIT touch $ LOCK rsync -avz foo bar rm $ LOCK trap-INT TERM EXIT else echo "rsync is already running"fi

이 솔루션의 특수성은 명령이 트랩에 포함되어 신호가 수신 될 때

INT, 기간, 종료

스크립트는 잠금 파일을 중지하고 지 웁니다.

잠금 파일이 확인 된 시간과 생성 된 시간 사이에 위의 스크립트에서 경쟁 상황이있을 수 있다는 점은 가치가 있습니다. 한 가지 가능한 해결책은 기존 파일로 리디렉션하지 않는 리디렉션 및 bash의 noclobber 모드를 사용하는 것입니다.

LOCK = "/ var / run / rsync.lock"if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; 그런 다음 트랩 'rm -f "$ LOCK"; $? '종료 INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap-INT TERM EXIT else echo "rsync가 이미 실행 중입니다 : $ (cat $ LCK)"fi

후자의 특징은 내가 이미 말했듯이 noclobber 모드와 잠금 파일에 실행중인 프로세스의 PID가 포함되어 있다는 것입니다.

다음과 같은 다른 솔루션이 있다는 점도 언급 할 가치가 있습니다.

flock

o

solo

그러나이 게시물에서는 bash의 자체 리소스와 솔루션을 공유하고 싶었습니다. 이것으로 트랩에 대해 조금 더 배울 수 있습니다 훌륭한 가이드.


5 코멘트, 당신의 것을 남겨주세요

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   라파엘 카스트로

    큰! 공유해 주셔서 감사합니다.

  2.   nx

    좋은 기사입니다. 'echo "rsync is already running : $ (cat $ LCK)"'를 'echo "rsync is already running : $ (cat $ LOCK)"'으로 변경하세요.

    안부

  3.   디글랑고스

    매우 흥미로운 기사입니다. 이것은 내가 유지합니다.

  4.   호아킨

    명심해야 할 매우 유용한 명령입니다. 게시물에 게시 한 스크립트에서 스크립트가 중지되었을 때 생성 한 일부 파일을 삭제하기 위해 사용했습니다.

  5.   다니에프

    매우 흥미 롭습니다.