Valami ilyesmi:

PID = 3187: / home / morganc / test1.out

Hogyan használhatom a find parancsot, hogy az felsorolja a test1.out fájlom PID számát, valamint a hely könyvtárát található?

Előre is köszönöm.

Megjegyzések

  • biztos benne, hogy nem keveri össze a következőket: find parancs a ps?
  • Ha a folyamatot létrehozó vagy megnyitott fájl még mindig fut, akkor Gilles válasza működik. a fájlt létrehozó folyamat már nem fut, akkor nincs mód arra, hogy megtudja, mi történt a múltban.
  • Hogyan került a fájl PID-be?

Válasz

Két megoldást próbálhat ki:

fuser /path/to/opened/file 

vagy

lsof /path/to/opened/file 

Válasz

Ha a folyamat tulajdonosa, amely létrehozta vagy megnyitotta a fájlt, Ön megteheti

ls -o /proc/*/fd 2> /dev/null 

amely felsorolja az összes PID azonosítójú fájlt a felhasználói azonosítóhoz; ha nem fut sok folyamat, csak manuálisan nézze meg a kimenetet. Minta: olyan folyamat keresése, amely vmstat.out nyitva van:

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 

Tehát a PID 27737 fájlnak vmstat.out fájlja nyitva van, a teljes elérési út pedig /home/oracle/log/vmstat.out

Ha ki akarja szűrni a kimenet nagy részét, próbálja ki ezt:

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)> 

És akkor keresse meg a PID közvetlenül az érdekes fájl fölött.

Tehát a többi folyamat figyelmen kívül hagyása érdekében az awk-hez mentem, mentettem az előző sort, és kinyomtattam az előző sort, amikor rájöttem, hogy az aktuális sor 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 

Válasz

Attól függően ha értelmezem a kérdését (lásd a megjegyzéseket), akkor a megoldása a következő lenne:

find $root_dir -name $file_name -exec pidof {} \; 

vagy:

find $root_dir -name $file_name -exec fuser {} \; 

A $root_dir változót a kezdő könyvtárként definiálja a keresés végrehajtásához, és $file_name a keresett fájl neveként.

Az első alternatíva futtatható fájl keresése esetén fut, és a második alternatíva egy futtatható fájl által futtatott adatfájlra vonatkozik.

Ennek tesztelésére (az első alternatíva esetében) megnyitottam egy fájlt a parancsot, megnyomta a C-z gombot, hogy megállítsa és háttérbe helyezze, és lefuttatta az find /usr/bin -name less -exec pidof {} \; parancsot. A második alternatíva teszteléséhez létrehoztam egy ~/test.txt adatfájlt, lefuttattam less ~/test.txt, majd C-z, majd find ~ -name test.txt -exec fuser {} \;.

Megjegyzések

  • Mi van, ha 20 ember fut less abban az időben? Úgy gondolom, hogy az OP azt akarja, hogy egy kimeneti fájlnév keressen.
  • A kérdést úgy értettem, hogy egy futtatható fájl keresése, nem pedig egy adatfájl, tehát az Ön esetében húsz pid-t kapna és egyetlen út. Látom azonban, hogyan értelmezi a kérdést másképp, ezért ' a válaszomhoz hozzáadok egy második megoldást, amely az Ön esetére terjed ki. Köszönöm.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük