How to list the open file descriptors (and the files they refer to) in my current bash session

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 access
  • w – write access
  • u – 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

How to list the open file descriptors (and the files they refer to) in my current bash session


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

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x