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
보시는 바와 같이 새로 덮어씌워지는 것을 확인할 수 있습니다.