/ tmp가 존재합니까?


42

/tmp내부 파일에 쓰기 전에 확인하고 작성 해야합니까? sudo rm -rf /tmp매우 드문 경우이기 때문에 아무도 실행하지 않았다고 가정하십시오.


16
"보증하다"는 무슨 뜻입니까? FHS는이를 요구하므로 모든 FHS 호환 배포판에 해당됩니다. 그러나 FHS를 준수하지 않는 많은 특수 목적 배포판이 있습니다. / tmp를 사용하지 않고 유닉스 / 리눅스 배포판을 만들 수는 있지만, 시스템 관리에 관심이 있는지 여부는 전적으로 시스템 관리에 관심이 있는지 여부에 달려 있습니다.
Lie Ryan

1
정리를 위해 다음 재부팅에 의존하는 대신 자신의 임시 디렉토리를 작성하고 삭제하면 안됩니까?
WGroleau

4
@WGroleau OP에 대해서는 모르겠지만 자체 시스템을 위해 쓰는 스크립트에서는 일반적으로 임시 파일을 /tmp(로 만든 mktemp) 하위 디렉토리에 넣은 다음 종료시 해당 하위 디렉토리를 제거합니다. 대부분의 시스템은 읽기 전용으로 마운트 cd되어 있으며 쓰기 가능한 디렉토리 를 기억하지 않아도됩니다.
Fox

1
@ WGroleau 나는 그것을 재부팅하기 위해 재부팅에 의존하지 않습니다. mktemp외모는 정말 좋은, i'l 아마를 사용하여 종료합니다.
Ayush

7
그래 @jamesqf, 다시 부팅이되지 않는 요구 웁니다 /tmp. 그러나, 반대로 그것을됩니다 허용 그렇게하고, 아마 WGroleau 너무 멀리와는 추정하고있다. 내가 /tmpA는 tmpfs그 종료에 지워지지 않도록, RAM에서 개최. 그럼에도 불구하고 이는 FHS가 보장하지 않는 시스템의 세부 사항 일뿐입니다. 그래서 원래의 코멘트에, 그것은 존재에 의존하는 어리 석음의 또는 아무것도의 부재 /tmp부츠 사이.
underscore_d

답변:


60

POSIX 와 마찬가지로 존재 하는 FHS 명령 에 따라 최소한 호환 시스템에 의존 할 수 있지만 실제로는 유닉스 계열 시스템에 존재한다는 것이 거의 보장됩니다. 그러나 시스템 관리자 나 사용자는 임시 파일의 다른 위치를 선호 할 수 있습니다. 자세한 내용 은 여러 플랫폼에서 올바른 tmp 디렉토리 찾기 를 참조하십시오./tmp


이것은 물론 설계 실패입니다. /tmp이름입니다. $TMPDIR또 다른 이름입니다. 당신이 믿을 수없는 경우 /tmp임시 디렉토리의 올바른 이름 인, 당신은 왜 믿을 수있는 $TMPDIR올바른 환경 변수의 이름 인? 해당 변수 $TMPDIRVAR의 이름을 확인해야하는 이유는 무엇 입니까? 한 수준의 간접 지식이면 충분 합니다. 실제 스토리지에 대해서는 아무 것도 말하지 않고 단지 이름 일뿐입니다. /tmp
MSalters

@MSalters 그것보다 조금 더 있습니다. 네임 스페이스 이전 $TMPDIR에는 각 사용자가 별도의 임시 디렉토리를 갖거나 심지어 다른 프로그램에 대해 다른 임시 디렉토리를 사용할 수 있도록했습니다. 단일 /tmp은 네임 스페이스 또는 이와 유사한 것을 제공하지 않습니다. 또한 고려해야 할 많은 역사 (또는 레거시)가 있습니다.
Stephen Kitt

사용자 당은 타당한 점이지만, 이것이 좋은 디자인이 ~/tmp그것을 사용하는 이유 입니다. /tmp물론 여전히 동일한 물리적 위치 일 수 있습니다.
MSalters

44

실제로 /tmp는 존재하는 것이 거의 보장됩니다. 그러나 파일이 존재하더라도 임시 파일을 저장해야한다는 의미는 아닙니다.

표준 규칙은 사용하는 TMPDIR환경 변수를. 존재하는 경우 임시 파일의 디렉토리를 가리 킵니다. 존재하지 않는 경우 임시 파일을에 넣으십시오 /tmp.

셸 스크립트 "${TMPDIR:-/tmp}"에서 임시 파일 위치로 사용할 수 있습니다 .이 값은 설정되어 TMPDIR있으면 ¹ 값으로 확장 되고 /tmp그렇지 않으면 확장됩니다. 또는 TMPDIR명령을 사용하여 설정되지 않은 경우 조건부로 설정할 수 있습니다.

: "${TMPDIR:=/tmp}"

그리고 안에 임시 파일을 만듭니다 "$TMPDIR".

모든 응용 프로그램은 /tmp또는 아래에 파일을 만들 수 있습니다 $TMPDIR. 또한이 디렉토리는 사용자간에 공유 될 수 있으므로 파일을 작성할 때 권한에주의해야합니다. 많은 시스템 (Linux, * BSD)에는 mktemp올바른 디렉토리에 파일을 안전하게 작성 하는 명령 이 있습니다. 일반적으로 mktemp쉼표 공격의 가능성으로 인해 공유 디렉토리에 파일을 안전하게 작성할 수없는 쉘 스크립트에서 임시 파일 및 디렉토리를 작성 하는 것이 좋습니다 mkdir. 오류를 올바르게 처리하면 문제가 없습니다.

¹ 및 비어 있지 않음-변수가 비어있는 경우 어쨌든 그대로 사용할 수 없으며 일반적으로 파일 이름을 포함해야하는 경우 비어 있거나 설정되지 않은 변수를 같은 방식으로 처리하는 것이 좋습니다.


11
사용자가 파일 이름 충돌을 예상해야 할 수도 있습니다. 따라서 IMO는 / tmp에 파일을 작성하는 유일한 방법은 명령 mktemp이며 이것이 $ TMPDIR "도 자동으로 처리해야합니다.
rudimeier

이것이 당신이 원하는 대답입니다. / tmp는 물론 / tmp도없는 시스템을 보았습니다.
Joshua

1
또한 A.10 디렉토리 구조 및 장치 상태 : ... /tmp디렉토리는 가용성을 가정하는 히스토리 애플리케이션을 수용하기 위해 POSIX.1-2008에 유지됩니다. 환경 변수에 적합한 디렉토리 이름을 제공하도록 TMPDIR구현할 것을 권장하며 응용 프로그램은 TMPDIR임시 파일을 작성하기위한 컨텐츠를 사용하도록 권장됩니다 . ...
Andrew Henle

3
mktemp비록 그것이 GNU (Linux) , OpenBSD , FreeBSDmacOS 와 같은 가장 인기있는 운영 체제에 있지만 POSIX에는 없다는 것을 아는 것은 슬픈 일 입니다.
Franklin Yu

1
libc , PerlPythonmktemp같은 많은 스크립팅 및 프로그래밍 언어에서 이와 유사한 함수를 사용할 수 있음을 추가 할 가치 가 있습니다 .
Gaurav

6

존재하는 것은 매우 가능성이 높습니다 있지만 또 다른 이유를 확인해야합니다 보장 아니에요 . 많은 시스템에서 /tmp디스크가 아닌 RAM으로 백업되며 몇 GB로 제한 될 수 있습니다. (Fedora 시스템에서는 기본적으로 RAM의 절반입니다.) 따라서 존재 여부뿐만 아니라 원하는 것을 넣을 공간이 있는지 확인해야합니다.

큰 것이 있으면를 사용하십시오 /var/tmp/.


2
진행하기 전에 사용 가능한 공간을 확인하는 것이 "유닉스 방식"인지 확실하지 않습니다. 특히 필요한 공간이 항상 정확히 알려지지 않았기 때문입니다. 어쨌든 파일 시스템이 가득 찰 경우 쓰기 오류를 정상적으로 처리 할 수 ​​있도록 준비해야합니다. 당신이 그렇게하려고한다면, 거짓 부정과 긍정적 인 경향이있는 사전 점검을 통해 무엇을 얻을 수 있습니까?
Nate Eldredge

2
실패 사례를 얼마나 잘 처리 할 수 ​​있는지에 따라 다릅니다. 요점은 /tmp큰 파일을 처리 할 수 있다고 가정하지 않는 것 입니다. 적당한 속도의 링크를 통한 10GB 다운로드라고 가정 해 봅시다. "유닉스 방식"인지 아닌지, 작동하지 않을 것이라는 점에서 몇 시간을 찾는 것은 꽤 비참합니다.
mattdm

1
@mattdm 일찍 확인하는 것은 좋지만 실패를 처리해야합니다. 다운로드가 시작될 때 / tmp에 10GB를 사용할 수 있지만 다운로드가 실행되는 동안 다른 사용자가 5GB를 복사 할 수 있습니다. 이제 뭐? 허.
Zan Lynx

명확히! 나는 이것을 실패를 처리하지 않는 변명으로 의미하지는 않는다.
mattdm

"큰 것이있는 경우"-/ tmp를 사용하고 필요한 경우 OS를 교체하십시오.
UKMonkey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.