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
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.
find
parancs aps
?