Назад | Перейти на главную страницу

Что отфильтровывает флаг lsof -c?

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

Надеюсь, причина несоответствия ясна из приведенного примера.