파일처리_26 이중 실행이 가능한 임시 파일 작성하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: date, cat
키워드: 임시 파일, 프로세스 ID
사용처: 스크립트를 동시에 실행할 때 임시 파일이 중복되지 않도록 하고 싶을 때


실행예제

$ ./tmppid.sh
Sat Dec 14 22:50:16 KST 2013

스크립트

#!/bin/sh

tmpfile="tmp.$$" #---- 1

date > $tmpfile #----- 2
sleep 10

cat $tmpfile #-------- 3
rm -f $tmpfile

   

해설

이 스크립트는 프로그램에서 잠시 사용하는 임시 파일을 다룹니다. 스크립트 실행 시 date 명령어로 현재 시각을 임시 파일에 쓰고 10초 기다린 후 그 값을 파일에서 읽어서 출력합니다. 이 예제에서는 셸 변수 tmpfile로 지정한 임시 파일을 프로세스 ID($$)로 생성하는 것이 포인트입니다.

셸 스크립트는 도중 계산 결과나 처리 결과 등을 나중에 사용하기 위해 임시 파일을 자주 사용합니다. 이때 중복 실행 시 처리를 주의해야 합니다. 예를 들어 tmpfile.txt라는 이름의 고정 파일명으로 임시 파일을 만들면 나중에 실행된 프로세스에서 값을 덮어쓰게 됩니다.

  • 임시 파일이 중복되면 문제가 발생함


이런 일이 생기지 않게 하려면 같은 셸 스크립트를 실행하더라도 각각 프로세스가 다른 이름으로 임시 파일을 만들어야 합니다. 예제에도 있듯 확장자를 .$$로 하는 방법이 자주 쓰입니다.

$$는 셸 특수 변수로서 실행하는 셸 프로세스 ID가 값입니다. 프로세스 ID란 OS에서 프로세스마다 할당하는 고유한 숫자로 같은 셸 스크립트라도 프로세스가 다르면 다른값이 됩니다. 1에서 이런 성질을 이용해서 임시 파일의 파일명에 프로세스 ID를 사용합니다. 2에서는 이 임시 파일에 date 명령어 결과를 출력해서 현재 시각을 지정합니다.

예제에서는 sleep 명령어로 지연이 발생하므로 다른 사람이 동시에 실행해서 중복 실행될지도 모릅니다. 하지만 모두 다른 프로세스가 되므로 각각 다른 프로세스 ID가 되어서 결과적으로 tmp.\(로 지정한 임시 파일명도 모두 서로 다른 파일명이 됩니다. 따라서 `3`{:.info}에서 임시 파일의 내용을 출력해도 중복 실행된 프로세스 사이에 영향을 받지 않습니다. 이렇듯 프로세스마다 다른 값을 쓰고 싶으면\)를 사용하는 것이 법칙이므로 기억해두기 바랍니다.

   

주의사항

  • 임의의 숫자로 하나뿐인 파일명을 가진 임시 파일을 만드는 mktemp라는 명령어가 있습니다. 이 예제처럼 프로세스 ID를 사용하면 악의가 있는 공격자가 비교적 쉽게 임시 파일명을 추측할 수 있으므로 웹 애플리케이션 등은 보안을 생각해서 mktemp 명령어를 사용하는 걸 추천하기도 합니다.