[shell script] 파일 디스크립터 닫기

HYEOB KIM·2022년 4월 26일
0

Shell

목록 보기
50/71

열려있는 파일 디스크립터 확인하기

lsof -a -p $$ -d 0,1,2 명령을 이용해 파일 디스크립터에 대한 정보를 볼 수 있습니다.

  • -p $$ : -p프로세스 ID를 지정하는 옵션입니다. $$는 현재 PID를 의미하는 환경 변수입니다.
  • -d 옵션 뒤의 파라미터는 조회하고 싶은 파일 디스크립터의 번호를 ,로 구분해서 여러 개 적을 수 있습니다.
  • -a는 서로 다른 옵션의 결과에 대한 AND 연산을 수행합니다.
$ lsof -a -p $$ -d 0,1,2
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    545966 hyeob    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    545966 hyeob    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    545966 hyeob    2u   CHR  136,0      0t0    3 /dev/pts/0

스크립트 내에 lsof 명령을 입력해놓고 특정 파일 디스크립터에 대해 열어놓으면 아래와 같이 결과가 나타납니다.

$ cat test1
#!/bin/bash
exec 3>test
exec 7<test

lsof -a -p $$ -d 0,1,2,3,7

$ ./test1
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
test1   547776 hyeob    0u   CHR  136,0      0t0      3 /dev/pts/0
test1   547776 hyeob    1u   CHR  136,0      0t0      3 /dev/pts/0
test1   547776 hyeob    2u   CHR  136,0      0t0      3 /dev/pts/0
test1   547776 hyeob    3w   REG  253,0        0 412450 /home/hyeob/devops/Script/test
test1   547776 hyeob    7r   REG  253,0        0 412450 /home/hyeob/devops/Script/test

3, 7번 파일 디스크립터에 대해 열려있는 것을 확인할 수 있습니다.
출력 리다이렉션의 경우 쓰기(w), 입력 리다이렉션의 경우 읽기(r)로 표시된 것을 확인할 수 있습니다.

파일 디스크립터 닫기

&-로 리다이렉트하면 열려 있는 파일 디스크립터를 닫을 수 있습니다.

$ cat test1
#!/bin/bash
exec 3>test

echo "this is a test line of data" >&3

exec 3>&-

echo "this won't work" >&3

$ ./test1
./test1: line 8: 3: Bad file descriptor

$ cat test
this is a test line of data

파일 디스크립터를 닫게 되면 닫은 파일 디스크립터로 향하는 출력들은 모두 에러가 발생합니다.

$ cat test1
#!/bin/bash
exec 3>test

echo "this is a test line of data" >&3

exec 3>&-

lsof -a -p $$ -d 0,1,2,3

$ ./test1
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
test1   547834 hyeob    0u   CHR  136,0      0t0    3 /dev/pts/0
test1   547834 hyeob    1u   CHR  136,0      0t0    3 /dev/pts/0
test1   547834 hyeob    2u   CHR  136,0      0t0    3 /dev/pts/0

lsof 명령어로 확인해보았을 때 3번 파일 디스크립터가 닫혀 있는 것을 확인할 수 있습니다.

파일 디스크립터를 닫았다가 다시 열면?

파일 디스크립터를 닫았다가 다시 열어서 출력하면 어떻게 될까요?

$ cat test1
#!/bin/bash
exec 3>test

echo "this is a test line of data" >&3

exec 3>&-

exec 3>test
echo "it won't work" >&3

$ cat test
it won't work

보시는 바와 같이 새로 덮어씌워지는 것을 확인할 수 있습니다.

profile
Devops Engineer

0개의 댓글