Como listar processos bloqueando arquivo?

51

Usando flock, vários processos podem ter um bloqueio compartilhado ao mesmo tempo ou aguardar para adquirir um bloqueio de gravação. Como obtenho uma lista desses processos?

Ou seja, para um determinado arquivo X, idealmente, encontre a identificação do processo de cada processo que mantém ou está aguardando um bloqueio no arquivo. Seria um começo muito bom, porém, apenas para obter uma contagem do número de processos aguardando um bloqueio.

Benubird
fonte

Respostas:

42

lslocks, do pacote util-linux , faz exatamente isso.

Na MODEcoluna, os processos que aguardam um bloqueio serão marcados com a *.

mattdm
fonte
3
O apt-cache diz que o util-linux já é a versão mais recente (2.20.1-1ubuntu3), mas eu não tenho lslocks; existe um repositório que eu possa usar que me dê isso?
Benubird
2
Parece que isso foi adicionado na 2.22, então a versão do Ubuntu é muito antiga. Presumivelmente, uma nova versão estará disponível eventualmente. (Esse também é o caso do RHEL 6 ou CentOS.) Você pode criar você mesmo ou usar a lsofabordagem sugerida por Joel Davis.
mattdm
6
lslocks/proc/locks, em uma pitada, você pode ler isso diretamente, com a ressalva de que os arquivos são identificados pelo dispositivo e pelo inode, e não pelo nome. Como você conhece o arquivo, isso não deve ser um problema. As entradas bloqueadas têm um ->prefixo antes da coluna do tipo de bloqueio (adicionando uma coluna a essa linha).
precisa saber é o seguinte
27

Duas possibilidades: lsof(minha preferência) ou lslk(especificamente para bloqueios de arquivo):

[root@policyServer ~]# lslk | grep "master.lock"
SRC          PID   DEV  INUM   SZ TY M   ST WH  END LEN NAME
master      1650 253,0 12423   33  w 0    0  0    0   0 /var/lib/postfix/master.lock

[root@policyServer ~]# lsof | grep "master.lock"
master     1650      root   10uW     REG              253,0       33      12423 /var/lib/postfix/master.lock

A saída de lslk é auto-expansível, mas lsofcoloca a descrição do bloqueio na coluna "FD" ( 10uWacima). Na página do manual:

The mode character is followed by one of these lock characters, describing the type of lock applied to the file:

N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part      of the file;
X for an SCO OpenServer Xenix lock on the      entire file;
                       space if there is no lock.

Portanto, a coluna "FD" lsofacima é dividida em:

10O descritor literal deste arquivo aberto. O que está vinculado por/proc/1650/fd/10

u O arquivo está aberto para leitura e gravação

W programa tem um bloqueio de gravação no arquivo.

Bratchley
fonte
11
Não consigo encontrar onde obter o lslk e ele parece não ser mais mantido. Vale ressaltar, também, que se você quiser que o lsof mostre apenas os processos que realmente estão bloqueando o arquivo, precisará grep para "^ mutex". Também não faz distinção entre 'segurar' e 'bloquear'.
Benubird
O primeiro caractere de letra do campo FD é o arquivo com o qual ele foi aberto (suponho que seja isso o que você quer dizer com segurando) o caractere opcional da segunda letra é o bloqueio (se houver) que ele possui no arquivo (que eu ' m assumindo é o que você quer dizer com "bloqueio") Também flock! = mutex. Seu grep teria perdido fechaduras como a que no post (para não mencionar o primeiro campo é o nome do programa ...)
Bratchley
D'oh! Você está certo - "mutex" era o nome do meu script, portanto, grepping para 'mutex' é aplicável apenas ao meu caso. Obrigado por apontar isso
Benubird 9/13
assim parece que eu feito um dodói também: "caráter primeira letra é o modo que tem o arquivo aberto com ..."
Bratchley
5

lsof pode ajudar a ver a lista de arquivos. aqui está uma maneira de ver os arquivos bloqueados.

sudo lsof /var/lib/dpkg/lock 
Hafiz Shehbaz Ali
fonte
0

caso lsofesteja faltando no sistema, ls /proc/*/fd/* | grep LOCK_FILE_NAMEdeve fornecer as mesmas informações.

PypeBros
fonte