1. 사용 명령어 |
(1) date
(2) cat
2. 키워드 & 사용처 |
(1) 키워드
임시 파일, 프로세스 ID
(2) 사용처
스크립트를 동시에 실행할 때 임시 파일이 중복되지 않도록 하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./tmppid.sh
Fri Mar 26 14:52:11 KST 2021
4. 스크립트 |
#!/bin/sh
tmpfile="tmp.$$" ①
date > $tmpfile ②
sleep 10
cat $tmpfile ③
rm -f $tmpfile
5. 해설 |
이 스크립트는 프로그램에서 잠시 사용하는 임시 파일을 다룹니다. 스크립트 실행 시 date 명령어로 현재 시각을 임시 파일에 쓰고 10초 기다린 후 그 값을 파일에서 읽어서 출력합니다. 이 예제에서는 셸 변수 tmpfile로 지정한 임시 파일을 프로세스 ID($$)로 생성하는 것이 포인트입니다.
셸 스크립트는 도중 계산 결과나 처리 결과 등을 나중에 사용하기 위해 임시 파일을 자주 사용합니다. 이때 중복 실행 시 처리를 주의해야 합니다. 예를 들어 tmpfile.txt라는 이름의 고정 파일명으로 임시 파일을 만들면 나중에 실행된 프로세스에서 값을 덮어쓰게 됩니다.
이런 일이 생기지 않게 하려면 같은 셸 스크립트를 실행하더라도 각각 프로세스가 다른 이름으로 임시 파일을 만들어야 합니다. 예제에도 있듯 확장자를 .$$로 하는 방법이 자주 쓰입니다.
$$는 셸 특수 변수로서 실행하는 셸 프로세스 ID가 값입니다. 프로세스 ID란 OS에서 프로세스마다 할당하는 고유한 숫자로 같은 셸 스크립트라도 프로세스가 다르면 다른값이 됩니다. ①에서 이런 성질을 이용해서 임시 파일의 파일명에 프로세스 ID를 사용합니다. ②에서는 이 임시 파일에 date 명령어 결과를 출력해서 현재 시각을 지정합니다.
예제에서는 sleep 명령어로 지연이 발생하므로 달느 사람이 동시에 실행해서 중복 실행될지도 모릅니다. 하지만 모두 다른 프로세스가 되므로 각각 다른 프로세스 ID가 되어서 결과적으로 tmp.$$로 지정한 임시 파일명도 모두 서로 다른 파일명이 됩니다. 따라서 ③에서 임시 파일의 내용을 출력해도 종복 실행된 프로세스 사이에 영향을 받지 않습니다. 이렇듯 프로세스마다 다른 값을 쓰고 싶으면 $$를 사용하는 것이 법칙이므로 기억해두기 바랍니다.
<주의사항>
임의의 숫자로 하나뿐인 파일명을 가진 임시 파일을 만드는 mktemp라는 명령어가 있습니다. 이 예제처럼 프로세스 ID를 사용하면 악의가 있는 공격자가 비교적 쉽게 임시 파일명을 추측할 수 있으므로 웹 애플리케이션 등은 보안을 생각해서 mktemp 명령어를 사용하는 걸 추천하기도 합니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 날짜 처리 - 051 date 명령어로 두 날짜를 비교하고 날짜차를 구하기 (0) | 2021.03.26 |
---|---|
[Linux 셸 스크립트] 파일처리 - 050 sed로 파일 치환 심볼릭 링크를 실제 파일로 바꾸지 않게 하기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 파일처리 - 048 .svn 등 숨은 파일과 디렉터리만 나열하기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 파일처리 - 047 바이너리 파일에 포함된 문자열 열기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 파일처리 - 046 작업 파일을 만들 때 내용을 읽지 못하도록 보안 대책 세우기 (0) | 2021.03.26 |
댓글