I am running in an interactive bash session. I have created some file descriptors, using exec, and I would like to list what is the current status of my bash session.
Is there a way to list the currently open file descriptors?
I am running in an interactive bash session. I have created some file descriptors, using exec, and I would like to list what is the current status of my bash session.
Is there a way to list the currently open file descriptors?
Yes, this will list all open file descriptors:
$ ls -l /proc/$$/fd
total 0
lrwx------ 1 isaac isaac 64 Dec 28 00:56 0 -> /dev/pts/6
lrwx------ 1 isaac isaac 64 Dec 28 00:56 1 -> /dev/pts/6
lrwx------ 1 isaac isaac 64 Dec 28 00:56 2 -> /dev/pts/6
lrwx------ 1 isaac isaac 64 Dec 28 00:56 255 -> /dev/pts/6
l-wx------ 1 isaac isaac 64 Dec 28 00:56 4 -> /home/isaac/testfile.txt
Of course, as usual: 0 is stdin, 1 is stdout and 2 is stderr.
The 4th is an open file (to write) in this case.
Assuming you want to list the file descriptors that are attached to any terminal, you can use lsof/fuser or similar like:
$ lsof -p $$ 2>/dev/null | awk '$NF ~ /\/pts\//'
bash 32406 foobar 0u CHR 136,31 0t0 34 /dev/pts/31
bash 32406 foobar 1u CHR 136,31 0t0 34 /dev/pts/31
bash 32406 foobar 2u CHR 136,31 0t0 34 /dev/pts/31
bash 32406 foobar 3u CHR 136,31 0t0 34 /dev/pts/31
bash 32406 foobar 255u CHR 136,31 0t0 34 /dev/pts/31
These tools basically parse /proc, so you can just access /proc/$$/fd/ too e.g.:
ls /proc/$$/fd/*
Use the lsof utility to print all file descriptors for the current shell process (process identified by -p $$) and (-a) where the file descriptor is numeric (-d 0-256):
$ lsof -p $$ -a -d 0-256
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 16883 ant 0u CHR 136,15 0t0 18 /dev/pts/15
bash 16883 ant 1u CHR 136,15 0t0 18 /dev/pts/15
bash 16883 ant 2u CHR 136,15 0t0 18 /dev/pts/15
bash 16883 ant 255u CHR 136,15 0t0 18 /dev/pts/15
Pipe into Awk to print only the file descriptor and its corresponding filename:
$ lsof -p $$ -a -d 0-256 | awk '{ printf("%4s:\t%s\n", $4, $NF) }'
FD: NAME
0u: /dev/pts/15
1u: /dev/pts/15
2u: /dev/pts/15
255u: /dev/pts/15
Note: when lsof prints the file descriptors, it appends the following code to indicate the file access mode:
r – read accessw – write accessu – read and write accessIf you happen to want a graphical solution, gnome-system-monitor allows you to see the opened file descriptors of a process. Right click on any process opens a contextual menu, then you can click Open Files. Or you can just select the process and press CTRL+O.
Bonus: There is also an option in the sandwich menu to search opened files by filename