sourcecode

예기치 않은 bash 종료에서 생성된 임시 파일을 제거하는 중

copyscript 2023. 4. 19. 23:23
반응형

예기치 않은 bash 종료에서 생성된 임시 파일을 제거하는 중

scriptbash의 임시 파일을 만들고 .처리 종료 시에 삭제하고 있습니다만, 스크립트가 장시간 실행되고 있기 때문에 실행 중에 종료하거나 단순히 CTRL+C를 실행해도 임시 파일은 삭제되지 않습니다.
실행이 종료되기 전에 이러한 이벤트를 포착하여 파일을 정리할 수 있는 방법이 있습니까?

또, 그 임시 파일의 이름이나 장소에 관한 베스트 프랙티스가 있습니까?
현재 다음 중 어느 쪽을 사용할지 잘 모르겠습니다.

TMP1=`mktemp -p /tmp`
TMP2=`mktemp -p /tmp`
...

그리고.

TMP1=/tmp/`basename $0`1.$$
TMP2=/tmp/`basename $0`2.$$
...

아니면 더 나은 해결책이 있을까요?

보통 모든 임시 파일을 저장할 디렉토리를 만든 후 바로 EX를 만듭니다.스크립트가 종료될 때 이 디렉토리를 청소하는 IT 핸들러.

MYTMPDIR="$(mktemp -d)"
trap 'rm -rf -- "$MYTMPDIR"' EXIT

모든 임시 파일을 다음 위치에 저장하면$MYTMPDIR대부분의 경우 스크립트가 종료되면 모두 삭제됩니다.SIGKILL -9를 종료하면 되므로 EXSIGKILL(kill -9)은 프로세스를 종료합니다IT부문의 정보입니다.

출구 또는 control-c에서 실행하도록 "트랩"을 설정할 수 있습니다.

trap '{ rm -f -- "$LOCKFILE"; }' EXIT

또는 제가 가장 좋아하는 unix-isms 중 하나는 파일을 열고 열어둔 상태에서 삭제하는 것입니다.파일은 파일 시스템에 남아 있고 사용자는 파일을 읽고 쓸 수 있지만 프로그램이 종료되는 즉시 파일이 사라집니다.하지만 배시 파티에서는 어떻게 하는지 모르겠어.

이 아니라 가 당신의 임시 파일을 할 경우, 는 BTW를 하고 싶을 수 있습니다: temtempp 를tem temtem 、 mktemp tem b b b b 。TMPDIRtmp하고 있습니다./var/tmp.temp는 핸드롤 솔루션 번째 옵션 않습니다 쓰고 있습니다.TMPDIR=/var/tmp gvim -d foo bar를 들어예를 들어.

trap 명령어를 사용하여 스크립트 종료 또는 CTRL-C 등의 신호를 처리합니다.자세한 내용은 Greg's Wiki를 참조하십시오.

에는, 「」를 합니다.basename $0는 충분한 파일을 할 수 있는 하는 것 에 좋은 방법입니다.

tempfile() {
    tempprefix=$(basename "$0")
    mktemp /tmp/${tempprefix}.XXXXXX
}

TMP1=$(tempfile)
TMP2=$(tempfile)

trap 'rm -f $TMP1 $TMP2' EXIT

그냥 고르는 대답은bashism은 「」, 「」라고 하는 )

trap "{ rm -f $LOCKFILE }" EXIT

이 bash일 Ctrl+).dash 클래식한 「 」입니다.sh호환성이 필요한 경우 트랩하는 모든 신호를 열거해야 합니다.

, 가 시그널 에는, 「0」(EX)에 해 주세요.되어 IT가 됩니다.trap명령어를 입력합니다.

EX가 있는 경우 모든 신호를 한 줄에 스택하지 않는 이유IT 신호

이 스크립트를 보다 잘 이해하려면 , 다른 시스템간에 변경 없이 동작하는 다음의 스크립트를 참조해 주세요.

#!/bin/sh

on_exit() {
  echo 'Cleaning up...(remove tmp files, etc)'
}

on_preExit() {
  echo
  echo 'Exiting...' # Runs just before actual exit,
                    # shell will execute EXIT(0) after finishing this function
                    # that we hook also in on_exit function
  exit 2
}


trap on_exit EXIT                           # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR  # 1 2 3 15 30


sleep 3 # some actual code...

exit 

종료 에 실제 했을 때 중 일부를 할 수 있기 됩니다.preExit경우 에서 코드를할 수 .IT부문(IT부문)

양호한 HAB아름다운 디자인

  • 변수의 값이 어떤 초원거리 시간(특히 이러한 버그로 인해 오류가 발생할 경우)에 절대 변경되지 않는다고 가정하지 마십시오.

  • 트랩이 코드에 적용 가능한 경우 변수 값을 즉시 확장하도록 하십시오.전달된 변수 이름trap작은 따옴표로 묶으면 어획 후까지 가치 확대가 지연됩니다.

  • 파일 이름에 공백이 포함되지 않는다고 가정하지 마십시오.

  • Bash 사용${VAR@Q} ★★★★★★★★★★★★★★★★★」$(printf '%q' "$VAR")공백 및 파일 이름의 따옴표 및 캐리지 리턴과 같은 기타 특수 문자로 인해 발생하는 문제를 해결합니다.

    zTemp=$(mktemp --tmpdir "$(basename "$0")-XXX.ps")
    trap "rm -f ${zTemp@Q}" EXIT

$$와 함께 예측 가능한 파일 이름을 사용하는 다른 방법은 보안 취약점이므로 절대 사용할 생각을 하지 마십시오.싱글 유저 PC의 단순한 퍼스널스크립트라고 해도 상관없습니다.그것은 몸에 익혀서는 안 되는 아주 나쁜 습관이다.BugTraq는 "비보안 임시 파일" 사고로 가득합니다.임시 파일의 보안 측면에 대한 자세한 내용은 여기를 참조하십시오.

처음에는 안전하지 않은 TMP1과 TMP2의 할당에 대해 견적을 낼까 생각했지만, 다시 생각해 보니 좋은 생각이 아닌 것 같습니다.

사용하는 것을 선호합니다.tempfile그러면 안전한 방법으로 /tmp에 파일이 생성되므로 파일 이름을 걱정할 필요가 없습니다.

tmp=$(tempfile -s "your_sufix")
trap "rm -f '$tmp'" exit

mktemp로 작성된 tmp 파일을 굳이 삭제할 필요가 없습니다.나중에 삭제됩니다.

$$ 접두사보다 더 많은 고유 파일을 생성하므로 가능하면 mktemp를 사용합니다.또한 임시 파일을 생성하여 명시적으로 /tmp에 저장하는 플랫폼 간 방법이 더 많은 것 같습니다.

언급URL : https://stackoverflow.com/questions/687014/removing-created-temp-files-in-unexpected-bash-exit

반응형