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 mit ps?
  • 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.