lsof
stands for 'List of Open Files’. This command is used to report all
the open files and the process that currently opened them. Open files
include disk files, pipes, network sockets and devices opened by all
processes.
This
can be very use full when we see issue which unmouting a file system.
We can trace out which files are being open and can kill them to
unmount.
A
Basic execution of lsof gives ,
[root@vx111a
test]# lsof | head
COMMAND
PID USER FD TYPE DEVICE SIZE NODE NAME
init
1 root cwd DIR 8,8 4096 2 /
init
1 root rtd DIR 8,8 4096 2 /
init
1 root txt REG 8,8 38652 11370583
/sbin/init
init
1 root mem REG 8,8 245376 918515
/lib/libsepol.so.1
init
1 root mem REG 8,8 129900 918498
/lib/ld-2.5.so
init
1 root mem REG 8,8 1693796 918499
/lib/libc-2.5.so
FD
– Represents the file descriptor. Some of the values of FDs are,
*
cwd – Current Working Directory
*
txt – Text file
The
out put explains most of the columns , but we FD and TYPE requires
some more info
FD
– Represents the file descriptor. Some of the values of FDs are,
*
cwd – Current Working Directory
*
txt – Text file
*
mem – Memory mapped file
*
mmap – Memory mapped device
*
NUMBER – Represent the actual file descriptor. The character after
the number i.e t;; font-size: 9.0pt; line-height: 115%;
mso-bidi-font-size: 11.0pt;"> * DIR – write
TYPE
– Specifies the type of the file. Some of the values of TYPEs are,
*
REG – Regular File
*
DIR – Directory
*
FIFO – First In First Out
*
CHR – Character special file
To
find all the open files in the current directory
[root@vx111a
test]# lsof $PWD
COMMAND
PID USER FD TYPE DEVICE SIZE NODE NAME
bash
4132 root cwd DIR 8,8 4096 6127709 /root/test
sleep
4159 root cwd DIR 8,8 4096 6127709 /root/test
top.sh
4226 root cwd DIR 8,8 4096 6127709 /root/test
bash
4234 root cwd DIR 8,8 4096 6127709 /root/test
vi
4258 root cwd DIR 8,8 4096 6127709 /root/test
lsof
4929 root cwd DIR 8,8 4096 6127709 /root/test
List
all Process that opened a specific file
[root@vx111a
test]# lsof top.sh
COMMAND
PID USER FD TYPE DEVICE SIZE NODE NAME
top.sh
4226 root 255r REG 8,8 40 6128296 top.sh
List
opened files under a directory
If
we need to find the files that are opened under a directory including
the subdirectories we can use +D like
[root@vx111a
test]# lsof +D $PWD
COMMAND
PID USER FD TYPE DEVICE SIZE NODE NAME
bash
4132 root cwd DIR 8,8 4096 6127709 /root/test
sleep
4159 root cwd DIR 8,8 4096 6127709 /root/test
bash
4161 root cwd DIR 8,8 4096 6127709 /root/test
top.sh
4226 root cwd DIR 8,8 4096 6127709 /root/test
top.sh
4226 root 255r REG 8,8 40 6128296 /root/test/top.sh
List
opened files based on process names starting with
Lsof
allows us to see the files that are opened by process that is
starting with a specific name. This can be achieved using -c option,
Dev:vx1423:djbs001-~
$ lsof -c java | head
COMMAND
PID USER FD TYPE DEVICE SIZE/OFF NODE
NAME
java
17077 root cwd DIR 253,9 4096
369127 /software/jboss/jon-server- /jbossas/bin
To
find all the open files in the current File System
COMMAND
PID USER FD TYPE DEVICE SIZE NODE NAME
init
1 root cwd DIR 8,8 4096 2 /
init
1 root rtd DIR 8,8 4096 2 /
init
1 root txt REG 8,8 38652 11370583 /sbin/init
init
1 root mem REG 8,8 245376 918515
/lib/libsepol.so.1
migration
2 root cwd DIR 8,8 4096 2 /
List
files opened by a specific user
Dev:vx1423:djbs002-~
$ lsof -u root | head
COMMAND
PID USER FD TYPE DEVICE SIZE/OFF NODE
NAME
bash
12698 root cwd DIR 253,7 4096
229381 /logs/jboss/ews/1.0/domains/jas
bash
12698 root rtd DIR 253,0 4096
2 /
bash
12698 root txt REG 253,0 801528
131130 /bin/bash
You
can use Negation too, if you want to see all files opened by user
leaving root you can use
lsof
-u ^root
List
all open files by a specific processtop.sh 4226 root txt REG
8,8 735004 10780705 /bin/bash
top.sh
4226 root mem REG 8,8 129900 918498 /lib/ld-2.5.so
top.sh
4226 root cwd DIR 8,8 4096 6127709 /root/test
top.sh
4226 root rtd DIR 8,8 4096 2 /
top.sh
4226 root txt REG 8,8 735004 10780705 /bin/bash
top.sh
4226 root mem REG 8,8 129900 918498 /lib/ld-2.5.so
top.sh
4226 root mem REG 8,8 1693796 918499 /lib/libc-2.5.so
top.sh
4226 root mem REG 8,8 20668 918500 /lib/libdl-2.5.so
top.sh
4226 root mem REG 8,8 13276 918521
/lib/libtermcap.so.2.0.8
top.sh
4226 root mem REG 8,9 56479264 459245
/usr/lib/locale/locale-archive
top.sh
4226 root mem REG 8,9 25462 522496
/usr/lib/gconv/gconv-modules.cache
top.sh
4226 root 0u CHR 136,1 3 /dev/pts/1
top.sh
4226 root 1u CHR 136,1 3 /dev/pts/1
top.sh
4226 root 2u CHR 136,1 3 /dev/pts/1
top.sh
4226 root 255r REG 8,8 40 6128296 /root/test/top.sh
Kill
all process that belongs to a particular user
We
can use lsof to kill process that belong to a user much like,
kill
-9 `lsof -t -u root`
list
process id of a process which opened a specific file
[root@vx111a
test]# lsof -t /var/log/messages
7390
Execute
lsof in repeat mode
lsof
also support Repeat mode. It will first list files based on the given
parameters, and delay for specified seconds and again list files
based on the given parameters. It can be interrupted by a signal.
Repeat
mode can be enabled by using ‘-r’ or ‘+r’. If ‘+r’ is
used then, the repeat mode will end when no open files are found.
‘-r’ will continue to list,delay,list until a interrupt is given
irrespective of files are opened or not.
Each
cycle output will be separated by using ‘=======’. You also also
specify the time delay as ‘-r’ | ‘+r’.
lsof
-u root -c java -a -r5
Finding
Network Information
List
all network connections
[root@vx111a
test]# lsof -i (use ‘-i4′ or ‘-i6′ to list only ‘IPV4′ or
‘IPV6‘ )
rpc.statd
2382 root 3u IPv4 6100 UDP *:865
dhclient
2178 root 4u IPv4 5593 UDP *:bootpc
rpc.statd
2382 root 6u IPv4 6091 UDP *:862
rpc.statd
2382 root 7u IPv4 6110 TCP *:868 (LISTEN)
hpiod
2593 root 0u IPv4 7887 TCP
localhost.localdomain:2208 (LISTEN)
-family:
"Verdana","sans-serif"; font-size: 9.0pt;
line-height: 115%; mso-bidi-font-size: 11.0pt;">rpc.statd
2382 root 6u IPv4 6091 UDP *:862
rpc.statd
2382 root 7u IPv4 6110 TCP *:868 (LISTEN)
hpiod
2593 root 0u IPv4 7887 TCP
localhost.localdomain:2208 (LISTEN)
hpssd.py
2598 root 4u IPv4 7905 TCP localhost.localdomain:2207
(LISTEN)
List
all network files in use by a specific process
localhost:root-~
$ lsof -i -a -p 17077 | head
COMMAND
PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java
17077 root 101u IPv4 728449 0t0 TCP *:9093 (LISTEN)
.
.
List
processes which are listening on a particular port
[root@vx111a
test]# lsof -nPi tcp:80
or
[root@vx111a
test]# lsof -i :7080
COMMAND
PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java
17077 root 141u IPv4 728528 0t0 TCP *:7080 (LISTEN)
Some
Examples ,
Determine
if port is open or not
[root@vx111a
test]#lsof -i :22
Kill
a Process on the Port
[root@vx111a
test]#kill -9 `lsof -t -i :port_number`
Show
apps that use internet connection at the moment Or Lists all
listening ports together with the PID of the associated process
[root@vx111a
test]# lsof -P -i -n
COMMAND
PID USER FD TYPE DEVICE SIZE NODE NAME
dhclient
2178 root 4u IPv4 5593 UDP *:68
rpc.statd
2382 root 6u IPv4 630 UDP *:111
portmap
2347 rpc 4u IPv4 5931 TCP *:111 (LISTEN)
rpc.statd
2382 root 3u IPv4 6100 UDP *:865
rpc.statd
2382 root 6u IPv4 6091 UDP *:862
List
all files opened by a particular command
lsof
-c java
check
open ports
lsof
-Pni4 | grep LISTEN
Display
who is accessing a device
lsof
/dev/tty1
View
details of network activity
lsof
-i :7000-8000
List
all the files that have been deleted while they were still open.
lsof
| egrep "^COMMAND|deleted"
If
you delete a file that is still in use by a process, that space does
not get freed up (will not show up in df) until that process either
closes the file on its own, or is killed.
show
the working directories of running processes
lsof
-bw -d cwd -a -c java
find
the delete file ,which is in use
lsof
-n |grep delete
Grep
from Open Files
lsof
| grep "stuff"
View
Open File Descriptors for a Process
lsof
-p | wc -l
Find
The Command Line Of the Process Using Specific Port
cat
/proc/$(lsof -ti:631)/cmdline
More
To Come , happy learning :-)