GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu zjistit, který proces má soubor otevřený v Linuxu?

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 $oldumask
To 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$'


Linux
  1. Jak mohu sledovat data na sériovém portu v Linuxu?

  2. Jak mohu vytvořit soubor výpisu běžícího procesu v Linuxu?

  3. Jak zjistíte, jaký typ patice CPU má počítač se systémem Linux?

  1. Co je NFS a jak jej nainstalovat na Linux

  2. Jak vytvořit, extrahovat nebo otevřít soubor RAR v Linuxu?

  3. Jak zjistit, který proces vytváří soubor?

  1. Jak zjistit, který proces zapisuje na disk v Linuxu

  2. Jak zjistím, který proces má zámek na souboru v Linuxu?

  3. Jak mohu symbolicky propojit soubor v Linuxu?