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

  • jste si jisti, že nejste matoucí find příkaz s ps?
  • Pokud proces, který vytvořil nebo má otevřený soubor, stále běží, Gillesova odpověď bude fungovat. Pokud proces, který vytvořil soubor, již není spuštěn, pak neexistuje způsob, jak zjistit, co se stalo v minulosti.
  • Jak váš soubor získal PID?

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *