lsof покажет таблицу, в которой первый столбец будет именем команды, а каждая строка - открытым файлом. Итак, чтобы отображать только строки из определенной команды, скажем "java", имеет смысл попробовать lsof | grep ^java
. Это работает, но я понимаю, что у lsof есть собственный флаг, ограничивающий вывод только определенными командами - -c
. Но когда я пытаюсь lsof -c java
вывод совершенно другой. В -c
метод выводит только около 10 строк, тогда как grep
метод выводит несколько тысяч строк.
Итак, мой вопрос - что еще lsof -c
отфильтровано?
Поскольку вопрос получил отрицательное голосование, я уточню. Причина вопроса в том, что метод grep lsof | grep ^java
теоретически должен быть таким же выводом, как lsof -c java
. Я рассуждаю так -
lsof | grep ^java
будет показывать только строки, начинающиеся с букв «java», а начало каждой строки вывода lsof - это имя команды, открывшей файл.
lsof -c java
Предполагается, что будут отображаться только файлы, которые открываются командой, начинающейся с букв «java». Имя команды находится в начале каждой строки вывода lsof.
Я не знаю, как это объяснить яснее этого.
Чтобы ответить на комментарий yoonix, вот что говорится на странице руководства lsof о флаге -c. Вы должны прочитать его, прежде чем предлагать мне прочитать его для ответа:
-c c selects the listing of files for processes executing the command that begins with the characters of c. Multiple commands may be
specified, using multiple -c options. They are joined in a single ORed set before participating in AND option selection.
If c begins with a `^', then the following characters specify a command name whose processes are to be ignored (excluded.)
If c begins and ends with a slash ('/'), the characters between the slashes are interpreted as a regular expression. Shell
meta-characters in the regular expression must be quoted to prevent their interpretation by the shell. The closing slash may be
followed by these modifiers:
b the regular expression is a basic one.
i ignore the case of letters.
x the regular expression is an extended one
(default).
See the lsof FAQ (The FAQ section gives its location.) for more information on basic and extended regular expressions.
The simple command specification is tested first. If that test fails, the command regular expression is applied. If the simple
command test succeeds, the command regular expression test isn't made. This may result in ``no command found for regex:'' mes‐
sages when lsof's -V option is specified.
Команда lsof | grep php
отфильтрует все строки из вывода lsof
команда, содержащая php
как в любом месте строки в виде подстроки, как показано ниже:
apache2 26964 /usr/lib/php/20151012/wddx.so
apache2 26964 /usr/lib/php/20151012/tokenizer.so
apache2 26964 /usr/lib/php/20151012/sysvshm.so
apache2 26964 /usr/lib/php/20151012/sysvsem.so
Посредством чего lsof -c php
выбирает список файлов для процессов, выполняющих команду, которая начинается с символов php
:
php-fpm7. 1775 /lib/x86_64-linux-gnu/libpthread-2.23.so
php-fpm7. 1775 /lib/x86_64-linux-gnu/libc-2.23.so
php-fpm7. 1775 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
php-fpm7. 1775 /lib/x86_64-linux-gnu/libssl.so.1.0.0
php-fpm7. 1775 /usr/lib/x86_64-linux-gnu/libxml2.so.2.9.4
Надеюсь, причина несоответствия ясна из приведенного примера.