Obter todos os arquivos abertos para escrita com pid, recursivamente

3

Dado um pid, posso abrir todos os arquivos para escrever algo como:

lsof -p 28827 | awk '$4 ~ "[wW]"{print $(NF-1), $NF}'

Um desses acaba sendo um cachimbo:

28827 232611 pipe

Eu quero procurar todos os arquivos abertos por esse pipe. Se eu apenas fizer:

lsof | grep 232611

Isso me fornece vários processos, um dos quais é tee :

COMMAND     PID   TID    USER   FD      TYPE             DEVICE  SIZE/OFF    NODE NAME
<app>     28827       <me>       1w     FIFO                0,8       0t0  232611 pipe
<app>     28827 28836 <me>       1w     FIFO                0,8       0t0  232611 pipe
<app>     28827 28901 <me>       1w     FIFO                0,8       0t0  232611 pipe
....
tee       28828       <me>       0r     FIFO                0,8       0t0  232611 pipe

Como posso encontrar programaticamente o PID para o tee (ou geralmente, qualquer processo aberto com r access)? Não consigo simplesmente verificar $4 ~ "r" , pois, para a maioria das linhas, $4 nem é a coluna FD .

    
por Barry 28.05.2015 / 18:03

1 resposta

2

Deve ser suficiente apenas para dígitos seguidos por um ou mais r s:

lsof | grep -P '\b\d+r+\b'

Ou, se você não tiver o grep do GNU:

lsof | grep -E '\b[0-9]+r+\b' 

Os \b s marcam os limites das palavras e garantem que apenas campos inteiros sejam correspondidos. Alternativamente, se o seu grep suportar, você pode usar o -w flag:

lsof | grep -wE '[0-9]+r+' 

Então, usando isso, você pode obter os PIDs relevantes com

lsof | grep -wE '[0-9]+r+' a | awk '{print $2}'

@derobert apontou nos comentários abaixo que, se eu tivesse tido tempo para realmente ler as 2562 linhas de man lsof , eu teria descoberto que ele oferece uma opção -F que permite escolher os campos impressos. Para obter o tipo de acesso do arquivo, use a :

lsof -p 28827 -F a 
    
por 28.05.2015 / 18:16

Tags