So ähnlich:
PID = 3187: / home / morganc / test1.out
Wie verwende ich den Befehl find, damit die PID-Nummer meiner test1.out-Datei sowie das Verzeichnis von where aufgelistet werden es befindet sich?
Vielen Dank im Voraus.
Kommentare
- Sind Sie sicher, dass Sie
find
Befehl mitps
? - Wenn der Prozess, der die Datei erstellt hat oder geöffnet hat, noch ausgeführt wird, funktioniert Gilles Antwort Der Prozess, der die Datei erstellt hat, wird nicht mehr ausgeführt und kann dann nicht mehr herausfinden, was in der Vergangenheit passiert ist.
- Wie hat Ihre Datei eine PID erhalten?
Antwort
Sie können zwei Lösungen ausprobieren:
fuser /path/to/opened/file
oder
lsof /path/to/opened/file
Antwort
Wenn Sie der Eigentümer des Prozesses sind, der die Datei erstellt hat oder geöffnet hat, Sie kann
ls -o /proc/*/fd 2> /dev/null
ausführen, wodurch alle Dateien für PIDs für Ihre Benutzer-ID aufgelistet werden; Wenn nicht viele Prozesse ausgeführt werden, sehen Sie sich die Ausgabe einfach manuell an. Beispiel: Suchen Sie nach einem Prozess, bei dem vmstat.out
geöffnet ist:
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
PID 27737
hat die Datei vmstat.out
geöffnet und der vollständige Pfad lautet /home/oracle/log/vmstat.out
Wenn Sie den größten Teil der Ausgabe herausfiltern möchten, versuchen Sie Folgendes:
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)>
Und suchen Sie dann nach Die PID direkt über der interessierenden Datei.
Um die anderen Prozesse zu ignorieren, habe ich an awk weitergeleitet, die vorherige Zeile gespeichert und die vorherige Zeile gedruckt, als ich feststellte, dass die aktuelle Zeile mit einer 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
Antwort
Abhängig Wenn ich Ihre Frage interpretiere (siehe Kommentare), lautet Ihre Lösung entweder:
find $root_dir -name $file_name -exec pidof {} \;
oder:
find $root_dir -name $file_name -exec fuser {} \;
Hier definieren Sie die Variable $root_dir
als das Startverzeichnis, unter dem Sie möchten um Ihre Suche durchzuführen, und $file_name
als Name der Datei, nach der Sie suchen.
Die erste Alternative, wenn Sie nach einer ausführbaren Datei suchen wird ausgeführt, und die zweite Alternative betrifft den Fall, dass eine Datendatei von einer ausführbaren Datei ausgeführt wird.
Um dies zu testen (für die erste Alternative), habe ich eine Datei mit der , drückte C-z
, um es zu stoppen und in den Hintergrund zu stellen, und führte find /usr/bin -name less -exec pidof {} \;
aus. Um es für die zweite Alternative zu testen, habe ich eine Datendatei ~/test.txt
erstellt, less ~/test.txt
ausgeführt und dann C-z
, gefolgt von find ~ -name test.txt -exec fuser {} \;
.
Kommentare
- Was ist, wenn 20 Personen
less
zu der Zeit? Ich denke, das OP möchte, dass nach einem Ausgabedateinamen gesucht wird. - Ich habe die Frage als Suche nach der Verwendung einer ausführbaren Datei und nicht einer Datendatei verstanden. In Ihrem Fall würde er also zwanzig Pids und erhalten ein einziger Weg. Ich sehe jedoch, wie Sie die Frage anders interpretieren, also werde ich ' meiner Antwort eine zweite Lösung hinzufügen, um Ihren Fall abzudecken, danke.