lslocks
, do pacote util-linux , faz exatamente isso.
Na coluna MODE
, os processos aguardando por um bloqueio serão marcados com *
.
Usando flock
, vários processos podem ter um bloqueio compartilhado ao mesmo tempo ou aguardar para adquirir um bloqueio de gravação. Como faço para obter uma lista desses processos?
Ou seja, para um determinado arquivo X, é ideal encontrar o ID do processo de cada processo que mantém ou está aguardando um bloqueio no arquivo. Seria muito bom começar apenas para obter uma contagem do número de processos aguardando por um bloqueio.
lslocks
, do pacote util-linux , faz exatamente isso.
Na coluna MODE
, os processos aguardando por um bloqueio serão marcados com *
.
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 é autoexpansível, mas lsof
coloca a descrição de bloqueio na coluna "FD" (que é 10uW
acima). 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.
Assim, a coluna "FD" de lsof
acima se divide em:
10
O descritor literal deste arquivo aberto. O que está vinculado por /proc/1650/fd/10
u
O arquivo está aberto para leitura e gravação
O programa W
tem um bloqueio de gravação no arquivo.
lsof pode ajudar a ver a lista de arquivos. aqui está a maneira de ver os arquivos bloqueados.
sudo lsof /var/lib/dpkg/lock
no caso de lsof
estar faltando no sistema, ls /proc/*/fd/* | grep LOCK_FILE_NAME
deve fornecer as mesmas informações.