Das Problem sind ja oft nicht nur Prozesse, die ein Working-Dir auf dem auszugängenden Medium haben, sondern die dort auch Files geöffnet haben.
Alternativ, da fuser als auch lsof die Daten aus /proc/$PID/fd/* oder /proc/$PID/cwd holen:
Die Shell kann das auch (getestet auf BusyBox auf einem etwas angestaubten OpenWrt und einer DBOX2).
- ls /proc/[0-9]*/cwd /proc/[0-9]*/fd/* -ld 2> /dev/null | sed -ne 's@^.*/\([0-9]\+\)/.* -> \(/.*\)$@\2 (pid \1)@ p'
Dies funktioniert z.B. auch auf gelöschte Dateien:
- # ls /proc/[0-9]*/cwd /proc/[0-9]*/fd/* -ld 2> /dev/null | sed -ne 's@^.*/\([0-9]\+\)/.* -> \(/.*\)$@\2 (pid \1)@ p' | grep fooo
- /tmp/foooo (pid 3750)
- # ls /proc/[0-9]*/cwd /proc/[0-9]*/fd/* -ld 2> /dev/null | sed -ne 's@^.*/\([0-9]\+\)/.* -> \(/.*\)$@\2 (pid \1)@ p' | grep fooo
- /tmp/foooo (deleted) (pid 3750)
Zur Funktionsweise:
* ls /proc/[0-9]*/cwd /proc/[0-9]*/fd/* -ld
Dies listet die Dateien und Verzeichnisse auf, die von einem Progamm verwendet werden.
Der Switch "-ld" stellt sicher, dass im Falle eines Verzeichnisses der Verzeichniseintragselber und nicht dessen Inhalt angezegit wird.
* | Die Ausgabe von ls wird die Eingabe von SED
* sed is ein Stream Editor Input Stream -> Verarbeitung -> Output Stream
* sed -n gibt Zeilen des Streams nicht aus, es sei denn die Stream Operation p.
* sed -e erwartet als nächstes ein Sed-Script.
* das SED-Script ''s@^.*/\([0-9]\+\)/.* -> \(/.*\)$@\2 (pid \1)@ p' zerfällt in zwei Teile. s-subsitutue und p-Print. Wobei Print nur im Falle eines erfolgreichen Substitute ausgeführt wird.
* 's@^.*/\([0-9]\+\)/.* -> \(/.*\)$@\2 (pid \1)@' sucht nur File-Descriptoren (/ im Filename) und die Pid aus dem File oder Verzeichnisnamen und das Link-Ziel (alles nach dem " -> ") und erstez es durch $DATEINAME (pid $PID)
Was übrigends Tricky ist:
Wird der Kernel-Space-NFS-Server verwendet, kann es sein, dass unter dem Mountpoint keine benutzten Files oder Dirs angezeigt werden, jedoch, der Mountpoint trotzdem nicht ausgehängt werden kann.
Die passiert z.B. wenn ein Teil des Verzeichnisses via NFS exportiert wird (typischer Fall an den ich mich aus meiner DBOX2-Zeit zurück erinnere.)