O que lsof | gawk '$ 4 ~ / txt / {próximo} / REG. * \ (excluído \) $ / {printf “/ proc /% s / fd /% d \ n”, $ 2, $ 4} 'command mean

9

Estou lendo alguns artigos e vi este comando:

lsof|gawk '~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", ,}'

Algum corpo poderia me ajudar a entender isso

    
por Braiam 11.03.2014 / 11:58

2 respostas

7

Este comando irá imprimir arquivos de lsof que precisam de truncamento.

(Na verdade, não remove nem trunca nenhum arquivo).

lsof retornará uma lista de arquivos abertos (descritores de arquivos) que são canalizados para o awk, que os processa da seguinte forma.

gawk '~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", ,}'

A expressão acima contém duas expressões regulares separadas por um ponto-e-vírgula ;

vamos considerar a primeira parte gawk '~/txt/{next};

Aqui, se o quarto campo contiver txt , a próxima linha de texto será lida, o que o script começará a processar desde o início novamente.

A instrução next força o awk a parar imediatamente o processamento do registro atual e passa para o próximo registro. Isso significa que nenhuma outra regra é executada para o registro atual e o restante da ação da regra atual não é executada.

Agora vamos considerar a segunda parte do script /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", ,}'

Aqui, se a linha corresponder à expressão regular /REG.*\(deleted\)$ (o $ significa que (deleted) deve ser a última palavra na linha), apenas imprime >/proc/%s/fd/%d\n", , .

No comando lsof, é o número do descritor de arquivo (por exemplo, 53w , o w significa que o arquivador foi aberto para gravação) ou tipo de arquivo, dependendo do arquivo. O %d no printf garante que apenas os números serão impressos, removendo quaisquer caracteres de texto (como w ). imprime o id do processo do processo que usa o arquivo para imprimir algo como >/proc/3989/fd/53 e assim por diante imprimirá todos os arquivos que foram apagados, mas cujo descritor de arquivo permanece aberto, em outras palavras, descritores de arquivo que podem ser truncado com segurança.

    
por Stormvirux 11.03.2014 / 13:41
2

Este comando irá truncar arquivos apagados do lsof.

Este primeiro listará os arquivos abertos lsof

em seguida, procure por linhas recursivamente uma, em seguida, uma {next} que contenha REG '~/txt/{next};/REG.*\(deleted\)$/ como quarto parâmetro e, em seguida, esse processo relativo a essa linha será excluído

e imprima todos os resultados sem as linhas que contêm REG e marcadas como excluídas. {printf ">/proc/%s/fd/%d\n", ,}'

    
por user255675 11.03.2014 / 12:05