xref: /freebsd/usr.bin/fstat/fstat.1 (revision 6137b5f7b8c183ee8806d79b3f1d8e5e3ddb3df3)
1.\" Copyright (c) 1987, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\" 3. Neither the name of the University nor the names of its contributors
13.\"    may be used to endorse or promote products derived from this software
14.\"    without specific prior written permission.
15.\"
16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26.\" SUCH DAMAGE.
27.\"
28.Dd November 19, 2020
29.Dt FSTAT 1
30.Os
31.Sh NAME
32.Nm fstat
33.Nd identify active files
34.Sh SYNOPSIS
35.Nm
36.Op Fl fmnsv
37.Op Fl M Ar core
38.Op Fl N Ar system
39.Op Fl p Ar pid
40.Op Fl u Ar user
41.Op Ar
42.Sh DESCRIPTION
43The
44.Nm
45utility identifies open files.
46A file is considered open by a process if it was explicitly opened,
47is the working directory, root directory, jail root directory,
48active executable text, or kernel trace file for that process.
49If no options are specified,
50.Nm
51reports on all open files in the system for processes the user has access to.
52.Pp
53The following options are available:
54.Bl -tag -width "-N system"
55.It Fl f
56Restrict examination to files open in the same file systems as
57the named file arguments, or to the file system containing the
58current directory if there are no additional filename arguments.
59For example, to find all files open in the file system where the
60directory
61.Pa /usr/src
62resides, type
63.Ql fstat -f /usr/src .
64.It Fl M Ar core
65Extract values associated with the name list from the specified core
66instead of the default
67.Pa /dev/kmem .
68.It Fl m
69Include memory-mapped files in the listing; normally these are excluded
70due to the extra processing required.
71.It Fl N Ar system
72Extract the name list from the specified system instead of the default,
73which is the kernel image the system has booted from.
74.It Fl n
75Numerical format.
76Print the device number (maj,min) of the file system
77the file resides in rather than the mount point name; for special
78files, print the
79device number that the special device refers to rather than the filename
80in
81.Pa /dev ;
82and print the mode of the file in octal instead of symbolic form.
83.It Fl p Ar pid
84Report all files open by the specified process.
85.It Fl s
86Print socket endpoint information.
87.It Fl u Ar user
88Report all files open by the specified user.
89.It Fl v
90Verbose mode.
91Print error messages upon failures to locate particular
92system data structures rather than silently ignoring them.
93Most of
94these data structures are dynamically created or deleted and it is
95possible for them to disappear while
96.Nm
97is running.
98This
99is normal and unavoidable since the rest of the system is running while
100.Nm
101itself is running.
102.It Ar
103Restrict reports to the specified files.
104.El
105.Pp
106The following fields are printed:
107.Bl -tag -width MOUNT
108.It Sy USER
109The username of the owner of the process (effective uid).
110.It Sy CMD
111The command name of the process.
112.It Sy PID
113The process id.
114.It Sy FD
115The file number in the per-process open file table or one of the following
116special names:
117.Pp
118.Bl -tag -width jail -offset indent -compact
119.It Sy jail
120jail root directory
121.It Sy mmap
122memory-mapped file
123.It Sy root
124root inode
125.It Sy text
126executable text inode
127.It Sy tr
128kernel trace file
129.It Sy wd
130current working directory
131.El
132.Pp
133If the file number is followed by an asterisk
134.Pq Ql * ,
135the file is
136not an inode, but rather a socket, FIFO, or there is an error.
137In this case the remainder of the line does not
138correspond to the remaining headers\(em the format of the line
139is described later under
140.Sx SOCKETS .
141.It Sy MOUNT
142If the
143.Fl n
144flag was not specified, this header is present and is the
145pathname that the file system the file resides in is mounted on.
146.It Sy DEV
147If the
148.Fl n
149flag is specified, this header is present and is the
150number of the device that this file resides in.
151.It Sy INUM
152The inode number of the file.
153.It Sy MODE
154The mode of the file.
155If the
156.Fl n
157flag is not specified, the mode is printed
158using a symbolic format (see
159.Xr strmode 3 ) ;
160otherwise, the mode is printed
161as an octal number.
162.It Sy SZ\&|DV
163If the file is a semaphore,
164prints the current value of the semaphore.
165If the file is not a character or block special, prints the size of
166the file in bytes.
167Otherwise, if the
168.Fl n
169flag is not specified, prints
170the name of the special file as located in
171.Pa /dev .
172If that cannot be
173located, or the
174.Fl n
175flag is specified, prints the major/minor device
176number that the special device refers to.
177.It Sy R/W
178This column describes the access mode that the file allows.
179The letter
180.Ql r
181indicates open for reading;
182the letter
183.Ql w
184indicates open for writing.
185This field is useful when trying to find the processes that are
186preventing a file system from being down graded to read-only.
187.It Sy NAME
188If filename arguments are specified and the
189.Fl f
190flag is not, then
191this field is present and is the name associated with the given file.
192Normally the name cannot be determined since there is no mapping
193from an open file back to the directory entry that was used to open
194that file.
195Also, since different directory entries may reference
196the same file (via
197.Xr ln 1 ) ,
198the name printed may not be the actual
199name that the process originally used to open that file.
200.El
201.Sh SOCKETS
202The formatting of open sockets depends on the protocol domain.
203In all cases the first field is the domain name, the second field
204is the socket type (stream, dgram, etc.), and the third is the socket
205flags field (in hex).
206The remaining fields are protocol dependent.
207For TCP, it is the address of the tcpcb, and for UDP, the inpcb (socket pcb).
208For UNIX-domain sockets, its the address of the socket pcb and the address
209of the connected pcb (if connected).
210Otherwise the protocol number and address of the socket itself are printed.
211.Pp
212For example, the addresses mentioned above are the addresses which the
213.Ql netstat -A
214command would print for TCP, UDP, and UNIX-domain.
215Note that since pipes are implemented using sockets, a pipe appears as a
216connected UNIX-domain stream socket.
217A unidirectional UNIX-domain socket indicates the direction of flow with
218an arrow
219.Po Ql <-
220or
221.Ql ->
222.Pc ,
223and a full duplex socket shows a double arrow
224.Pq Ql <-> .
225.Pp
226When the
227.Fl s
228flag is used, socket endpoint information is shown after the address of the
229socket.
230For internet sockets the local and remote addresses are shown, separated with
231a double arrow
232.Pq Ql <-> .
233For UNIX/local sockets either the local or remote address is shown, depending
234on which one is available.
235.Sh EXIT STATUS
236.Ex -std
237.Sh EXAMPLES
238Show all open files except those opened by
239.Nm
240itself:
241.Bd -literal -offset indent
242$ fstat | awk '$2 != "fstat"'
243USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
244alice  bash         469 text /usr/local 143355 -rwxr-xr-x  1166448  r
245alice  bash         469 ctty /dev        346 crw--w----  pts/81 rw
246\&...
247.Ed
248.Pp
249Report all files opened by the current shell in the same file system as
250.Pa /usr/local
251including memory-mapped files:
252.Bd -literal -offset indent
253$ fstat -m -p $$ -f /usr/local
254USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
255bob  bash         469 text /usr/local 143355 -rwxr-xr-x  1166448  r
256bob  bash         469 mmap /usr/local 143355 -rwxr-xr-x  1166448  r
257\&...
258.Ed
259.Pp
260Requesting information about a file that is not opened results in just a
261header line instead of an error:
262.Bd -literal -offset indent
263$ fstat /etc/rc.conf
264USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W NAME
265.Ed
266.Pp
267All parameters after
268.Fl f
269will be interpreted as files, so the following will not work as expected:
270.Bd -literal -offset indent
271$ fstat -f /usr/local -m -p $$
272fstat: -m: No such file or directory
273fstat: -p: No such file or directory
274fstat: 469: No such file or directory
275\&...
276.Ed
277.Pp
278Show number of pipes opened by firefox processes:
279.Bd -literal -offset indent
280$ fstat | awk '$2=="firefox" && $5=="pipe"' | wc -l
281.Ed
282.Pp
283Show processes belonging to user
284.Dq bob
285whose standard error descriptor is opened in ttyv0:
286.Bd -literal -offset indent
287$ fstat -u bob | awk '$4 == 2 && $8 == "ttyv0"'
288bob  firefox    77842    2 /dev        103 crw-------   ttyv0 rw
289bob  xinit       1194    2 /dev        103 crw-------   ttyv0 rw
290\&...
291.Ed
292.Pp
293Show opened TCP sockets.
294This output resembles the one produced by
295.Ql netstat -A -p tcp
296:
297.Bd -literal -offset indent
298$ fstat | awk '$7 == "tcp"'
299alice  firefox    77991   32* internet stream tcp fffff800b7f147a0
300alice  firefox    77991  137* internet stream tcp fffff800b7f12b70
301\&...
302.Ed
303.Pp
304Show a list of processes with files opened in the current directory
305mimicking the output of
306.Xr fuser 1
307:
308.Bd -literal -offset indent
309$ fstat . | awk 'NR > 1 {printf "%d%s(%s) ", $3, $4, $1;}'
3102133wd(alice) 2132wd(alice) 1991wd(alice)
311.Ed
312.Pp
313Create a list of processes sorted by number of opened files in descending order:
314.Bd -literal -offset indent
315$ fstat | awk 'NR > 1 {print $2;}' | sort | uniq -c | sort -r
316 728 firefox
317  23 bash
318  14 sort
319   8 fstat
320   7 awk
321.Ed
322.Sh SEE ALSO
323.Xr fuser 1 ,
324.Xr netstat 1 ,
325.Xr nfsstat 1 ,
326.Xr procstat 1 ,
327.Xr ps 1 ,
328.Xr sockstat 1 ,
329.Xr systat 1 ,
330.Xr tcp 4 ,
331.Xr unix 4 ,
332.Xr iostat 8 ,
333.Xr pstat 8 ,
334.Xr vmstat 8
335.Sh HISTORY
336The
337.Nm
338command appeared in
339.Bx 4.3 tahoe .
340.Sh BUGS
341Since
342.Nm
343takes a snapshot of the system, it is only correct for a very short period
344of time.
345