Na většině systémů Linux lsof NAME
dělá svou práci:
[email protected]:~$ lsof /home/fin
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 21310 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21320 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21321 fin cwd DIR 8,1 4096 5054467 /home/fin
[email protected]:~$
Můžete také použít fuser
pro toto:
~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc: 28135
~> ps 28135
PID TTY STAT TIME COMMAND
28135 pts/36 T 0:00 less .vimrc
Otevření souboru není zámek, protože pokud každý proces musí nejprve zkontrolovat, zda je soubor otevřený, a nepokračovat, pokud ano, nebo jej vytvořit/otevřít, pokud není, pak by mohly dva procesy docela dobře zkontrolovat současně, oba najdou že není otevřený, pak jej oba vytvořte nebo otevřete.
Chcete-li použít soubor jako zámek, musí být operace kontroly a zámku jedna nepřerušitelná operace. V souborovém systému Unix toho můžete dosáhnout vytvořením souboru v režimu pouze pro čtení a jeho odstraněním pro odemknutí. Pokud soubor existuje (a je pouze pro čtení), vytvoření souboru se nezdaří, takže získáte check-and-lock v jediné atomické operaci.
Pokud je vaším zamykacím procesem skript shellu, který bude spuštěn jako démon, můžete tento efekt získat pomocí umask
, nastavení pro jednotlivé procesy, které nastavuje oprávnění pro vytváření nových souborů:
oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ > /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumaskTo také zapíše PID vlastnického procesu do souboru, což vyřeší váš další problém:
cat /var/lock/foo
Pokud jde o konkrétní otázku „Které procesy mají tento soubor otevřený?“, může být užitečná, když chcete odpojit souborový systém, ale nemůžete, protože některý proces má v sobě otevřený soubor. Pokud tyto příkazy nemáte k dispozici, můžete se zeptat /proc
jako root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
nebo jako smrtelný uživatel:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'