it-swarm-eu.dev

Jak zjistím, které procesy zabraňují odpojení zařízení?

Někdy bych rád odpojil sb zařízení s umount /run/media/theDrive, ale dostanu drive is busy chyba.

Jak zjistím, které procesy nebo programy přistupují k zařízení?

70
Stefan

Použijte lsof | grep /media/whatever zjistit, co používá připojení.

Zvažte také umount -l (líný umount), abyste zabránili novým procesům v používání jednotky během čištění.

70
Peter Eisentraut

Nejčastěji je nejlepším příkazem použít lsof (“ l i s t o pero f iles “).

lsof +f -- /media/usb0

kde /media/usb0 je připojovací bod jednotky USB nebo jiného souborového systému, který chcete odpojit. +f -- řekne lsofovi, že bude následující argument považovat za bod připojení; obvykle, ale ne vždy, spravuje sám, takže lsof /media/usb0 také funguje. To najde otevřené soubory (i ty nespojené), soubory mapované v paměti, aktuální adresáře a některá nejasná použití. Budete muset spustit příkaz jako root, abyste získali informace o procesech ostatních uživatelů (a myslím si, že existují unices, kde lsof musí být spuštěn jako root).

Existují způsoby použití, které lsof nenajde; to jsou neobvyklé na vyměnitelných médiích. Obsahují:

  • připojovací body: nelze odpojit /foo if /foo/bar je přípojný bod.
  • připojit zařízení: nemůžete odpojit /foo if /foo/bar je připojené blokové zařízení nebo běžný soubor připojený k smyčce, nebo pokud je zdrojem Linux vázaného připojení.
  • Export NFS: lsof nezjistí, že strom je exportován serverem NFS jádra.

Dalším příkazem, který může obsluhovat štipku, je fixační jednotka, která uvádí pouze PID procesů s otevřenými soubory v zařízení:

fuser -m /media/usb0

Otevřít soubory

Procesy s otevřenými soubory jsou obvyklými viníky. Zobrazit je:

lsof +f -- <mountpoint or device>

Výhodou je použití /dev/<device> Namísto /mountpoint: Přípojný bod zmizí po umount -l Nebo může být skrytý překrývajícím se připojením.

fuser lze také použít, ale podle mého názoru má lsof užitečnější výstup. fuser je však užitečný, pokud jde o zabíjení procesů způsobujících vaše dramata, abyste mohli pokračovat ve svém životě.

Seznam souborů na <mountpoint> (Viz upozornění výše):

fuser -vmM <mountpoint>

Interaktivní zabíjení pouze procesů se soubory otevřenými pro zápis:

fuser -vmMkiw <mountpoint>

Po opětovném připojení pouze ke čtení (mount -o remount,ro <mountpoint>) Je bezpečné (r) zabít všechny zbývající procesy:

fuser -vmMk <mountpoint>

Mountpoints

Pachatelem může být samotné jádro. Další souborový systém připojený k souborovému systému, který se pokoušíte umount, způsobí zármutek. Ověřte pomocí:

mount | grep <mountpoint>/

U smyčkových úchytů ( díky Stephen Kitt ), také zkontrolujte výstup:

losetup -la

Anonymní inody (Linux)

Anonymous inodes může být vytvořen:

  • Dočasné soubory (open s O_TMPFILE)
  • inotify hodinky
  • [eventfd]
  • [eventpoll]
  • [časovač]

Jedná se o nejvíce nepolapitelný typ pokémona a objeví se ve sloupci lsof ve sloupci TYPE jako a_inode (Což není zdokumentováno ve lsof) manuální stránka ).

Nezobrazí se v lsof +f -- /dev/<device>, Takže budete muset:

lsof | grep a_inode

Pro procesy zabíjení, které drží anonymní inody, viz: Seznam aktuálních hodinek inotify (cesta, PID) .

Hodinky inotify (Linux)

Tento komentář vysvětluje, proč by inotify nemělo zabránit odpojení, ale tato poznámka popisuje situace, ve kterých bude :

při volání vx_softcnt_flush() může zavěsit odpojení. K zablokování dochází, protože inotify sleduje přírůstek proměnné i_count A způsobuje, že v_os_hold value Zůstane zvýšená, dokud neotevřený pozorovatel neuvolní přidržení.

9
Tom Hale

Můžete použít lsof, jak řekl Peter, nebo pokud jste si jisti, že chcete všechny tyto věci zabít a odpojit, můžete pravděpodobně udělat něco jako:

fuser -Mk /mnt/path
umount /mnt/path
8
pioto

Pokud používáte GNOME, odpojení přes Nautilus zobrazí zprávu, která říká, který proces stále používá jednotku a soubor, který používá.

alt text

5
tshepang

Pro (alespoň) OpenBSD:

$ fstat /mnt/mountpoint

Například (použití doas k provedení fstat jako root, protože jinak bychom viděli pouze naše vlastní procesy):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

V tomto případě bych nemohl odpojit /usr/ports do uživatele _pbuild dokončil tyto dva procesy make.

1
Kusalananda