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.
$$
will give the process ID of the currently running shell. Try echo $$
and ps
and compare their outputs. Similar question here.
– ManSamVampire
May 23 '20 at 18:40
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/*
ls /proc/$$/fd/*
doesn't work for me. I get ls: /proc/48855/fd: No such file or directory
:(
– Christopher King
May 19 '21 at 22:48
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
bash
is not part of the kernel, so it can not know what other processes are doing, even those that it started. – Julie Pelletier Dec 28 '16 at 04:58