임시 파일을 / tmp 또는 현재 작업 디렉토리에 저장해야합니까?


76

임시 파일을 생성해야하는 프로그램이 있습니다. 클러스터 시스템 용으로 작성되었습니다.

해당 파일을 시스템 전체 임시 디렉토리 (예 :)에 저장 한 경우 /tmp일부 사용자는 / tmp에 대한 적절한 액세스 권한이 없기 때문에 프로그램이 실패했다고 불평했습니다. 그러나 해당 파일을 작업 디렉토리에 저장하면 해당 사용자는 그 신비한 파일을보고 싶지 않다고 불평했습니다.

어느 것이 더 좋은 습관입니까? 비용 절감 /tmp은 올바른 접근 방식 이라고 주장하고 실패가 "의도 한대로 작동"(예 : 관리자에게 적절한 권한 / 액세스 요청)으로 방어해야합니까?


3
프로그램에 액세스 권한이 있는지 확인하고 다른 임시 디렉토리를 찾지 못한 경우
ratchet freak

24
관리자가 액세스 권한을 망쳤다면 분명히 수정해야합니다. 관리자가 프로그램에 실행 권한을 추가하지 않은 경우 어떻게 하시겠습니까?
Doc Brown

7
대부분의 Windows 시스템에서는 / tmp를 찾을 수 없지만 임시 파일을 넣을 위치를 알려주는 OS 호출이 있습니다.
Ian

28
일부 사람들이 /tmp유닉스 계열 시스템에 액세스 할 수없는 경우 잘못 구성되었습니다. 수퍼 유저는 다음과 같은 작업을 수행해야합니다 chmod 1777 /tmp.
musiphil

12
$ TMPDIR은와 다른 경로를 가리킬 수 /tmp/있으므로 대신 사용해야합니다. 답변 중 일부를 참조하십시오;)
marcelm

답변:


141

임시 파일은 몇 가지 이유로 운영 체제 임시 디렉토리에 저장해야합니다.

  • 운영 체제 를 사용하면 파일 이름을 고유하게 유지하면서 해당 파일을 매우 쉽게 만들 수 있습니다 .

  • 대부분의 백업 소프트웨어는 임시 파일이 들어있는 디렉토리를 알고이를 건너 뜁니다. 현재 디렉토리를 사용하는 경우 백업이 자주 수행되면 증분 백업의 크기에 중요한 영향을 줄 수 있습니다 .

  • 임시 디렉토리는 다른 디스크 또는 RAM에있을 수 있으므로 읽기 / 쓰기 액세스가 훨씬 빨라 집니다.

  • 임시 파일은 재부팅하는 동안 종종 삭제됩니다 (램 디스크에있는 경우 단순히 손실 됨). 이렇게하면 앱이 임시 파일을 항상 올바르게 제거하지 않는 경우 (예 : 충돌 후) 무한히 증가 할 위험이 줄어 듭니다 .

    파일이 응용 프로그램 및 사용자 파일과 함께 저장되어 있으면 작업 디렉토리에서 임시 파일을 정리하기가 쉽지 않습니다. 현재 디렉토리 내에 별도의 디렉토리를 작성하여이 문제점을 완화 할 수 있지만 다른 문제점이 발생할 수 있습니다.

  • 경로 길이는 일부 플랫폼에서 너무 오래 될 수 있습니다. 예를 들어, Windows에서 일부 API, 프레임 워크 및 애플리케이션의 경로 제한 은 끔찍합니다 . 즉, 현재 디렉토리가 이미 트리 계층 구조에 있고 임시 파일 이름이 너무 길면 이러한 제한에 쉽게 도달 할 수 있습니다.

  • 서버 에서 임시 디렉토리의 증가를 모니터링하는 작업은 종종 즉시 수행됩니다. 다른 디렉토리를 사용하는 경우 디렉토리가 모니터되지 않을 수 있으며 전체 디스크를 모니터하는 것이 점점 더 많은 임시 파일임을 쉽게 알 수 없습니다.

액세스 거부 오류에 대해서는 운영 체제가 임시 파일을 작성하도록하십시오. 운영 체제는, 예를 들어, 특정 사용자가 아닌 다른 디렉토리에 대한 것을 알 수 있습니다 /tmp또는 C:\Windows\temp사용되어야한다; 따라서 해당 디렉토리에 직접 액세스하면 실제로 액세스 거부 오류가 발생할 수 있습니다.

운영 체제 호출을 사용할 때에도 액세스가 거부되면 시스템이 잘못 구성되었음을 의미합니다. 이것은 이미 Blrfl에 의해 설명되었습니다 . 컴퓨터를 구성하는 것은 시스템 관리자의 책임입니다. 응용 프로그램을 변경할 필요가 없습니다.

임시 파일 작성은 여러 언어로 간단합니다. 몇 가지 예 :

  • 세게 때리다:

    # The next line will create a temporary file and return its path.
    path="$(mktemp)"
    echo "Hello, World!" > "$path"
    
  • 파이썬 :

    import tempfile
    
    # Creates a file and returns a tuple containing both the handle and the path.
    handle, path = tempfile.mkstemp()
    with open(handle, "w") as f:
        f.write("Hello, World!");
    
  • 씨#:

    // Creates a file and returns the path.
    var path = Path.GetTempFileName();
    File.WriteAllText(path, "Hello, World!");
    
  • PHP :

    # Creates a file and returns the handle.
    $temp = tmpfile();
    fwrite($temp, "Hello, World!");
    fclose($temp);
    
  • 루비:

    require "tempfile"
    
    # Creates a file and returns the file object.
    file = Tempfile.new ""
    file << "Hello, World!"
    file.close
    

PHP 및 Ruby와 같은 일부 경우 핸들을 닫으면 파일이 제거됩니다. 언어 / 프레임 워크와 함께 번들로 제공되는 라이브러리를 사용하면 추가적인 이점이 있습니다.


2
"운영 체제에서 임시 파일을 작성하도록하십시오"란 무엇을 의미합니까? 예를 들어 fopen("/tmp/mytmpfile", "w");임시 파일을 처리하기 위해 시스템 호출을해야합니까?
simon

30
@gurka : tmpfile(3)임시 파일을 생성하기 위해 호출 하거나 최소한 mktemp(3)파일 이름을 생성하기 위해 호출 해야합니다.
TMN

3
@TMN : 사용자 공간에서 실행되는 라이브러리 함수일 뿐이며 운영 체제에서 제공 한 권한 오류를 무시할 마법이 없습니다.
musiphil

25
@musiphil tmpfile과 mktemp는 모두 외부 변수를 사용하여 임시 파일의 경로를 결정합니다. 이는 사용자 별 디렉토리 인 / tmp / 이외의 다른 디렉토리를 가리 키도록 설정되었을 수 있습니다. tmpfile 및 mktemp가 유효한 경로를 반환하는 동안 / tmp /에서 수동으로 파일 이름을 만들려고하면 실패 할 수 있습니다.
파이프

2
@ musiphil : 나는 그들이 권한 문제를 고칠 것이라고 말한 적이 없으며 시스템 호출을 사용하여 파일을 만드는 것에 대한 그의 질문에 대답했습니다.
TMN

33

/ tmp에 저장하는 것이 올바른 접근 방법이며, "의도 한대로 작동"(즉, 관리자에게 적절한 권한 액세스를 요청)으로 실패를 방어해야합니까?

이에 대한 표준이 있으며, 최선의 방법은 표준을 따르는 것입니다.

POSIX는 메인 프레임이 아닌 거의 모든 OS에서 발생할 가능성이 높지만 환경에 의해 재구성 될 수있는 기본값을 사용하여 디렉토리에 고유 한 이름의 임시 파일을 작성하기위한 조항이 있습니다.

  • C stdio.h헤더는 선택적으로 P_tmpdir시스템의 임시 디렉토리 이름을 지정 하는 매크로를 포함 할 수 있습니다 .
  • TMPDIR임시 파일의 위치를 ​​변경하기위한 표준 환경 변수입니다. POSIX 이전에 사용되는 다른 변수가 있었다, 그래서 나는 그 또는 처음으로 이동하는 경향 TMP, TEMPDIR그리고 TEMP그 펀트 그 중 어느 것도 존재하지 않는 경우 시스템 기본을 사용하여 값을가집니다.
  • mkstemp()tempfile()기능은 고유 임시 파일을 생성합니다.

사용자가 임시 파일을 작성하는 기능이 거부 된 경우 시스템이 잘못 구성되었거나 관리자가 해당 정책이 무엇인지 명확하지 않은 것입니다. 이러한 경우, 프로그램이 잘 확립 된 이식성 표준을 준수하고 표준이 지정하는 환경 변수를 사용하여 동작을 변경할 수 있다고 말하면 매우 확고한 입장에있을 것입니다.


P_tmpdirstdio.hC 언어 사양에 정의 된 일부가 아닙니다 . POSIX 또는 SVID로 정의 될 수 있습니다.
musiphil

1
@ musiphil : (지금 명확히 된) 답변에서 암시 된 것처럼 POSIX의 일부입니다. (기술적으로 POSIX가 통합 한 X / Open 시스템 확장입니다. pubs.opengroup.org/onlinepubs/009695399/basedefs/stdio.h.html을 참조하십시오 . )
Blrfl

위의 모든 사항에 완전히 동의합니다. 좋은 예는 리눅스 시스템입니다 pam_tmpdir-이 설정 TMPDIRTMP견고성 및 개인 정보 보호를 위해, 각 사용자에 대한 다른 것. TMPDIR단일 명령 으로 설정 하는 것도 유용합니다 . RAM 파일 시스템에 일반적인 임시 디렉토리가있는 경우 속도가 큰 임시 파일 (예 : 거대한)을 생성하는 명령에 대해이 작업을 수행해야 할 수 있습니다 sort. 사용자가 기대하는 표준 / 수칙을 무시하지 마십시오!
Toby Speight

환경에서 임시 파일의 위치를 ​​확인하고 / tmp를 하드 코딩하지 마십시오. 공유 tmp에는 보안 문제가 있으므로 필자가 자주 본 한 가지 완화 방법은 다른 사람에 대한 읽기 / 쓰기 권한이없는 사용자 별 / tmp 디렉토리를 만드는 것입니다. 가능한 경쟁 조건 및 심볼릭 링크 공격을 제거합니다.
Zan Lynx

9

temp-file-directory는 운영 체제 / 환경에 따라 크게 다릅니다. 예를 들어 web-servers-temp dir은 보안상의 이유로 os-temp-dir과 분리되어 있습니다.

ms-windows에서 모든 사용자는 자신의 temp-dir을 갖습니다.

이러한 기능을 사용할 수있는 경우 createTempFile () 을 사용해야합니다 .


1
Windows의 숨겨진 OS 제한 사항에 유의하십시오. 폴더의 최대 파일 수가 65,565로 제한되는 어려운 방법을 발견했습니다. 물론, 그 파일의 많은, 그리고 물론, 당신은 안 생각할 수 많은 사람들이 주위에 누워 것이 없다. 그러나 모든 앱이시기 적절하고 올바르게 작동하는 방식으로 정리된다고 확신 하십니까?
Mike Hofer

아, 네 의견이 너무 늦었다. 방금 위와 동일하게 작성했습니다. BTW 제한은 주로 NTFS가 아닌 GetTimeFileName () 함수의 메커니즘으로 인해 발생합니다. 언급 한 폴더 제한은 FAT32에만 적용됩니다 .
JensG

9

이전 답변은 정확하지만 대부분의 대규모 컴퓨터 클러스터에는 유효하지 않습니다.

컴퓨터 클러스터는 일반적으로 컴퓨터의 표준 규칙을 따르지 않으며 일반적으로 적절한 이유로 sysadmins와 논의 할 필요가 없습니다.

현재 디렉토리는 네트워크를 통해 액세스되는 중앙 파일 시스템을 참조합니다. 속도가 느릴뿐만 아니라 나머지 사용자를 위해 시스템에 부하를 가하기 때문에 많이 쓰지 않으면 사용하지 말아야하며 작업이 중단되면 복구 할 수 없습니다.

컴퓨팅 노드에는 사용 가능한 가장 빠른 파일 시스템 인 자체 하드 드라이브와 사용해야하는 것이 있습니다. 클러스터 문서는 일반적으로 무엇을 말해야한다 /scratch, /tmp/[jobid]또는 (일부 비 표준 환경 변수 $SNIC_TMP내가 사용하는 사람 중 하나).

따라서 내가 추천하는 것은 사용자가 구성 할 수있게 만드는 것입니다. 기본값은 쓰기 권한이있는 첫 번째가 될 수 있습니다.

  • $TMPDIR
  • tmpfile
  • /tmp
  • .

그러나이 방법을 사용하면 성공률이 낮을 것으로 예상되며 큰 경고를 내야합니다.

편집 : 강제로 사용자가 설정 해야하는 또 다른 이유를 추가하겠습니다. 클러스터 중 하나가로 $TMPDIR설정되었습니다 /scratch. 즉, 사용자가 쓰기 가능하고 로컬 하드 드라이브에 있습니다. 그러나 문서에 따르면 외부에서 작성한 /scratch/[jobid]모든 내용은 실행 도중에도 언제든지 삭제할 수 있습니다. 따라서 표준을 따르고 신뢰 $TMPDIR하면 무작위 충돌이 발생하여 디버깅하기가 매우 어렵습니다. 따라서을 수락 할 수는 $TMPDIR있지만 신뢰할 수는 없습니다.

일부 다른 클러스터에는이 변수가 올바르게 구성되어 있으므로 명시 적으로 신뢰하는 옵션을 추가 할 수 있습니다. $TMPDIR그렇지 않으면 크고 뚱뚱한 경고가 발생합니다.


1
이전 답변은 정확히 어느 것입니까?
Tulains Córdova

2
여기서 말하는 것은 프로그램이 임시 파일을 작성할 위치를 알려주기 위해 잘 확립 된 표준을 준수하는 사소한 단계를 거치지 않는 일부 클러스터이기 때문에 프로그램마다 필요한 추가 클러스터 별 사용자 정의입니다. 당신이 나에게 묻는다면 꽤 약한 차.
Blrfl

@Blrfl 당신이 원하는만큼 표준을 흔들고 표준에 완벽하게 부합하고 항상 충돌하는 코드를 작성할 수 있습니다. 사용하는 각 클러스터의 sysadmin과 싸울 수 있습니다. 또는 당신은 당신의 믿음을 받아들이고 그것을 구성 할 수있게 만들 수 있습니다. 또한 HPC에서는 일반적으로 클러스터의 사양 (사용 가능한 RAM, 파일 시스템의 상대적 속도, MPI 구현, 일반적인 자원의 가용성 등)에 맞게 코드를 조정해야합니다. "모든 규모에 맞는"크기는 없습니다.
Davidmh

@Davidmh : 이해했지만 요점은 아닙니다. 표준 놀라운 방법으로 구성 할 수 있도록합니다 . 표준을 준수하지 않는 클러스터에 알려진 코드를 사용하는 경우 진입 점과 같이 정확히 한 곳에 설정해야 합니다. 나머지 코드에서는 감사, 수정 및 잘못 될 위험이 적습니다.
Blrfl

1

많은 응용 프로그램의 경우 임시 파일을 $XDG_RUNTIME_DIR또는 안에 넣는 것을 고려해야 $XDG_CACHE_HOME합니다 (다른 XDG 디렉토리는 임시 파일 이 아닙니다). 환경에서 명시 적으로 전달되지 않은 경우 계산에 대한 지시 사항 은 XDG 기반 사양을 참조 하거나 해당 부분을 이미 구현 한 라이브러리를 찾으십시오.

그러나 $XDG_RUNTIME_DIR이것은 새로 추가 된 것이며 보안 문제로 인해 구형 시스템에 대한 표준 폴백은 없습니다.

둘 중 어느 것도 적합하지 않으면 /tmp올바른 장소입니다. 현재 디렉토리가 쓰기 가능하다고 가정 해서는 안됩니다 .


-2

이것은 대안과 비슷하지만 fopen () 이후에 파일을 unlink () 할 수 있습니다. 그것은 cource의 사용 패턴에 달려 있습니다.

가능한 경우 파일 연결을 해제하면 여러 가지 방법으로 도움이됩니다.

  • 파일을 볼 수 없습니다-사용자가 볼 수 없습니다.
  • 다른 프로세스에서 파일을 볼 수 없음-실수로 다른 프로세스가 파일을 수정할 가능성이 없습니다.
  • 프로그램 충돌시 쉬운 정리.

파일은 / tmp에 작성해야합니다. 사용자가 파일을 작성할 권한이없는 경우 시스템이 잘못 구성되었음을 의미합니다.

사용자 홈 디렉토리에는 파일을 작성할 수 없습니다. "아무도", "www-data"및 기타 많은 사용자와 같은 많은 사용자는 자신의 홈 디렉토리에 쓸 수있는 권한이 없거나 chroot ()를 사용합니다. chroot 환경에서도 / tmp는 여전히 존재합니다.


이것은 일반적으로 좋은 생각이지만 파일을 만들 디렉토리에 대한 쓰기 권한이없는 사용자에게는 도움이되지 않습니다.
5gon12eder

4
또한 임시 파일을 넣을 위치에 관한 질문에 대답하지 않습니다.
Blrfl

나는 내 대답이 어떻게 든 중요하다고 믿는다. 나는 편집했다. 아마도이 방법이 더 분명하다.
Nick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.