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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.
Method 2
lsof -a -p $$
Network fd only:
lsof -i -a -p $$
Method 3
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/*
Method 4
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%sn", $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 access
Method 5
If 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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0
