Něco takového:
PID = 3187: / home / morganc / test1.out
Jak mohu použít příkaz find, aby vypsal PID číslo mého souboru test1.out a adresář kde nachází se?
Předem děkujeme.
Komentáře
Odpověď
Můžete vyzkoušet 2 řešení:
fuser /path/to/opened/file
nebo
lsof /path/to/opened/file
Odpověď
Pokud jste vlastníkem procesu, který vytvořil nebo má soubor otevřený, vy umí
ls -o /proc/*/fd 2> /dev/null
, který zobrazí seznam všech souborů pro PID pro vaše ID uživatele; pokud nemáte spuštěných mnoho procesů, jednoduše se podívejte na výstup. Ukázka: hledá proces, který má vmstat.out
otevřený:
mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null /proc/27669/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history /proc/27737/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/oracle/log/vmstat.out lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify
Takže PID 27737
má soubor vmstat.out
otevřený a úplná cesta je /home/oracle/log/vmstat.out
Pokud chcete odfiltrovat většinu výstupu, zkuste toto:
mark (/home/oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E "(^/proc|vmstat.out)" /proc/27669/fd: /proc/27943/fd: lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/oracle/log/vmstat.out /proc/28047/fd: /proc/28048/fd: /proc/self/fd: mark (/home/oracle/log)>
A pak vyhledejte PID přímo nad souborem, který nás zajímá.
Takže abych ignoroval ostatní procesy, poslal jsem do awk, uložil předchozí řádek a vytiskl předchozí řádek, když jsem zjistil, že aktuální řádek začal s l
:
ls -l /proc/*/fd 2> /dev/null | \ grep -E "(^/proc|vmstat.out)" | \ awk "BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev $NF }" /proc/27943/fd:/home/oracle/log/vmstat.out
Odpověď
Podle podle toho, jak interpretuji vaši otázku (viz komentáře), bude vaše řešení buď:
find $root_dir -name $file_name -exec pidof {} \;
nebo:
find $root_dir -name $file_name -exec fuser {} \;
Kde definujete proměnnou $root_dir
jako výchozí adresář, pod kterým chcete proveďte vyhledávání a $file_name
jako název souboru, který hledáte.
První alternativa, pokud pro případ hledání spustitelného souboru spuštěna a druhá alternativa je pro případ spuštění datového souboru spustitelným souborem.
Chcete-li to otestovat (pro první alternativu), otevřel jsem soubor pomocí less
, stisknutím C-z
jej zastavit a umístit na pozadí a spustit find /usr/bin -name less -exec pidof {} \;
. Abych to otestoval pro druhou alternativu, vytvořil jsem datový soubor ~/test.txt
, spustil less ~/test.txt
a poté C-z
, následovaný find ~ -name test.txt -exec fuser {} \;
.
Komentáře
- Co když běží 20 lidí
less
v té době? Myslím, že OP chce hledat výstupní název souboru. - Chápal jsem, že jde o hledání použití spustitelného souboru, nikoli datového souboru, takže ve vašem případě by dostal dvacet pidů a jediná cesta. Vidím však, jak interpretujete otázku odlišně, takže ' přidám do své odpovědi druhé řešení, které se bude týkat vašeho případu, díky.
find
příkaz sps
?