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