O que o sinalizador lsof -c filtra?

1

lsof mostrará uma tabela com a primeira coluna sendo o nome do comando e cada linha, um arquivo aberto. Portanto, para mostrar apenas linhas de um comando específico, diga "java", faria sentido tentar lsof | grep ^java . Isso funciona, mas eu entendo que o lsof tem seu próprio sinalizador para limitar a saída somente a comandos específicos - -c . Mas quando eu tento lsof -c java , a saída é totalmente diferente. O método -c produz apenas cerca de 10 linhas, enquanto o método grep gera vários milhares de linhas.

Então, minha pergunta é: o que mais o lsof -c filtrou?

Como a pergunta tem um voto negativo, vou elaborar. A razão para a pergunta é que o método grep lsof | grep ^java deveria, teoricamente, ser a mesma saída que lsof -c java . Meu raciocínio é esse -

lsof | grep ^java mostrará apenas linhas que começam com as letras "java" e o início de cada linha de lsof output é o nome do comando que abriu o arquivo.

lsof -c java deve mostrar apenas arquivos que são abertos pelo comando que começa com as letras "java". O nome do comando está no início de cada linha de saída lsof.

Eu não sei explicar nada mais claro que isso.

Para responder ao comentário do yoonix, é isso que o lsof man page diz sobre o sinalizador -c. Você deve realmente lê-lo antes de sugerir que eu o leia para uma resposta:

   -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.
    
por Julian 18.10.2016 / 00:08

1 resposta

3

O comando lsof | grep php filtrará todas as linhas da saída do comando lsof contendo php como qualquer lugar na linha como uma subcadeia, como abaixo:

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

Por meio do qual lsof -c php seleciona a listagem de arquivos para processos que executam o comando que começa com os caracteres 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

Espero que o motivo da incompatibilidade esteja claro no exemplo dado.

    
por 18.10.2016 / 12:40

Tags