One of the easiest ways to list all open file descriptors is to use the
lsof
command
If you are here to list out all the open file descriptors, then you may be aware of what a file descriptor is and what the use of it is, but if you are unaware of file descriptors, then let me tell you that file descriptors are non-negative integer numbers that identify open files within the kernel.
And the kernel keeps track of these file descriptors to ensure that when a process requests to access a file, the system should know where it can be found.
I believe you understand the basic nature of a file descriptor after reading this, and if you want to learn more about it, you can read this article, which explains the concept of a file descriptor in detail.
Now let’s continue with this guide to show you the steps to listing out all the open file descriptors.
List File Descriptors in Linux
There are two common ways to list all open file descriptors: One way is to use the lsof
command line utility, and another way is to read through the /proc/PID/fd
directory.
Using the lsof command to list all open file descriptors
First, I will show you how you can use the lsof
command to list all open file descriptors, which is basically used to list all open files for a process running in your system.
To show you how it works, let me take a simple example where I’ll use the -p option to list all the files of the specific process, and to specify the process, I’m using the $$ to substitute the process ID of the current shell.
$ lsof -p $$
And here is the output, which shows that the current bash shell has four different file descriptor counts: 0, 1, 2, and 255, which are mixed with cwd (the current working directory), rtd (the root directory), txt (programme text or binary code), and mem (memory mapped file), which you can suppress for more concise output.
To remove other than file descriptors like (cwd, txt, mem, rtd information), you can use the -a and -d options to specify the range of file descriptors, and as usual, use -p with the process number, but here I’m substituting with $$ to get process id of current shell.
$ lsof -a -d 0-255 -p $$
If you’re wondering why “u” is attached next to the file descriptors, it means the file is open with read and write permission. It could also be r (file open with read permission), w (file open with write permission), or W (file open with write permission and write lock) in your case.
Using the /proc/PID/fd command to list all open file descriptors
The same thing can be done with the ls -l /proc/PID/fd command, which will also list all the file descriptors for the specific process.
For example, to get a list of all the file descriptors for the current shell, you could run the below command, which will list all the file descriptors with their paths and permissions.
$ ls -l /proc/$$/fd
If you want to look for a specific process, use the ps -aux | grep <program-name> command to get the process number, and then use the following command to list all the file descriptors:
$ ls -l /proc/1143912/fd
The output of the above command:
It is now up to you to decide which method you want to use to list all of the file descriptors.
If you have any questions or comments, please feel free to leave them in the comments section below. Until then, put your feet up and relax. As always, the next article will be up shortly.
A man with a tech effusive who has explored some of the amazing technology stuff and is exploring more. While moving towards, I had a chance to work on Android development, Linux, AWS, and DevOps with several open-source tools.