예기치 않은 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 。TMPDIR
tmp하고 있습니다./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
'sourcecode' 카테고리의 다른 글
SSL/TLS 보안 채널에서 Powershell Invoke-WebRequest 실패 (0) | 2023.04.19 |
---|---|
WPF: 단순한 TextBox 데이터 바인딩 (0) | 2023.04.19 |
내 Objective-C 싱글톤은 어떤 모습이어야 할까요? (0) | 2023.04.19 |
WPF에서 GridViewColumn 데이터를 자동 조정하고 오른쪽 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
텍스트 블록을 WPF ListBox로 강제 랩하다 (0) | 2023.04.14 |