lsof: mostra arquivos abertos como leitura-gravação

3

Quando tento remontar uma partição como read-only , recebo um erro /foo is busy . Eu posso listar todos os arquivos abertos de /foo com

lsof /foo

mas isso não mostra se os arquivos estão abertos read-only ou read-write . Existe alguma maneira de listar apenas arquivos que estão abertos como read-write ?

    
por Martin Vegter 20.11.2013 / 12:07

3 respostas

6

Para responder especificamente a essa pergunta, você pode:

lsof /foo | awk 'NR==1 || $4~/[0-9]+u/'

Isso mostrará os arquivos que estão abertos read-write sob o ponto de montagem foo . No entanto, provavelmente você realmente quer fazer é listar todos os arquivos que estão abertos para escrita. Isso incluiria os arquivos a que abriram write-only e os que abriram read-write . Para isso você faria:

lsof /foo | awk 'NR==1 || $4~/[0-9]+[uw]/'

Estes comandos devem funcionar desde que FD seja o quarto campo na saída e nenhum dos outros campos esteja em branco. Este é o caso para mim no Debian quando eu incluo um caminho no comando lsof , no entanto, se eu não o imprimir, e o campo TID extra, que às vezes fica em branco (e confundirá awk ). A milhagem pode variar entre distros ou lsof versões.

    
por 18.02.2014 / 15:11
2

Veja os valores da coluna FD na saída de lsof . Por exemplo:

sudo lsof +d /foo

As páginas de manual descrevem a interpretação; 'r' para leitura; 'w' para escrever 'e' u 'para acesso de leitura e escrita.

Isso pode ser facilmente usado para listar os objetos de interesse:

sudo lsof +d /foo | awk '/$4~/u/ {print $NF}'   
    
por 20.11.2013 / 13:50
1

Eu não tive nenhuma sorte usando lsof para listar processos com acesso de leitura / gravação aos arquivos (talvez eu tenha esquecido a opção na minha versão de lsof ), mas acabei encontrando this Guia do Oceano Digital que mostrou como obter essa informação usando fuser .

Aqui está uma saída de teste de uma caixa do Ubuntu 16.04:

$ sudo fuser -v /etc/os-release

                     USER        PID ACCESS COMMAND
/usr/lib/os-release: root        827 f.... snapd

$ sudo fuser -v /proc/kmsg

                     USER        PID ACCESS COMMAND
/proc/kmsg:          syslog      989 f.... rsyslogd

Conforme observado no guia :

The above output shows that, when ran in verbose mode, the fuse utility gives information about the USER, PID, ACCESS and COMMAND. There are many access types such as e(executable being run), r(root directory), f(open file. f is omitted in default display mode), F(open file for writing, F is omitted in default display mode) and m (mmap’ed file or shared library).

Em cada um dos exemplos acima, os arquivos estão abertos para leitura. Aqui está um exemplo de um arquivo que está aberto para gravação:

$ sudo fuser -v /run/systemd/journal/syslog

                     USER        PID ACCESS COMMAND
/run/systemd/journal/syslog:
                     root          1 F.... systemd
                     syslog      989 F.... rsyslogd 

Aqui você pode ver que systemd e rsyslogd têm acesso de gravação ao arquivo /run/systemd/journal/syslog "(soquete neste caso).

    
por 04.12.2017 / 17:39

Tags