Desde que eu tive a pergunta semelhante recentemente, eu queria compartilhar minhas descobertas aqui também. Também é assumido que o usuário é root
e como mencionado nas outras respostas.
Listar arquivos abertos em um diretório específico
lsof +D /var/log/
mostrará arquivos abertos de todos os usuários.
Especificando o usuário
lsof -u ${USER} +D /var/log/
mostrará todos os arquivos do usuário OU dentro do diretório específico (... AND independet do usuário).
Isso ocorre por causa e como declarado em man lsof
:
Since they represent exclusions, they are applied without ORing or ANDing and take effect before any other selection criteria are applied.
The -a option may be used to AND the selections. For example, specifying -a, -U, and -ufoo produces a listing of only UNIX socket files that belong to processes owned by user ''foo''.
Para listar arquivos abertos do usuário E dentro de um diretório específico somente
lsof -u ${USER} -a +D /var/log/
É então possível listar arquivos abertos que NÃO são o usuário E dentro de um diretório específico.
lsof -u ^${USER} -a +D /var/log/
Essa abordagem também funciona bem para conexões de rede. Ou seja, se estiver interessado em todas as conexões TCP ou UDP que são abertas pelo NOT em processos de execução raiz
lsof -u ^root -P -i TCP -i UDP
Para resolver o problema com o usuário não raiz, sudo
e sudoers
, será necessário Identifique o usuário chamando sudo
.
Listar todos os arquivos abertos em um diretório específico E aberto a partir do usuário
sudo lsof -u $(who | cut -d " " -f 1) -a +D /usr/lib/
caso contrário, mostraria arquivos abertos OU dentro do diretório E indepent do usuário.
Listar todos os arquivos abertos em um diretório específico NÃO aberto pelo usuário mencionado
sudo lsof -u ^$(who | cut -d " " -f 1) +D /usr/lib/