Ich möchte Dateien mit dem Befehl grep
durchsuchen Im Verzeichnis /var/run
/var/run
werden die im System ausgeführten Prozesse gespeichert und es werden Dateien mit pid
. Ich möchte eine Liste aller Dateien mit der Erweiterung pid
erhalten.
Befehl Ich verwende sudo grep -nr "*.pid" .
(Ich führe diesen Befehl aus dem Verzeichnis /var/run
)
Kommentare
- Dies ist keine korrekte Beschreibung von
/var/run
. Bestenfalls arbeiten Sie unter dem Missverständnis, dass PID-Dateien eine Notwendigkeit sind, obwohl sie tatsächlich ein gefährlicher und zutiefst fehlerhafter Mechanismus sind , den die Welt ach so hat -lang lang endlich lernen, die Weisheit loszuwerden.
Antwort
TL; DR : grep
ist falsches Werkzeug. Verwenden Sie find
mit den richtigen Optionen
Wenn Sie stat /var/run
ausführen, werden Sie schnell feststellen, dass /var/run
ein Symlink zu /run
Verzeichnis.
$ stat /var/run File: /var/run -> /run Size: 4 Blocks: 0 IO Block: 4096 symbolic link Device: 801h/2049d Inode: 696874 Links: 1 Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-02-07 13:17:01.225178554 +0800 Modify: 2017-12-18 20:44:12.898113636 +0800 Change: 2017-12-18 20:44:12.898113636 +0800
Sie benötigen also wirklich das Verzeichnis /run
Zum Durchsuchen von Dateien mit einem bestimmten Dateinamen benötigen Sie den Befehl find
:
$ find /run -name "*.pid" /run/charon.pid /run/starter.charon.pid /run/dhclient-wlp2s0.pid
Da einige Dateien in diesem Verzeichnis zu gehören Root- oder andere Systembenutzer müssen diesen Befehl möglicherweise mit sudo
verwenden .
Alternativ können Sie das Flag -L
verwenden, um folgende Symlinks zuzulassen und find
on /var/run
:
$ find -L /var/run -name "*.pid" /var/run/charon.pid /var/run/starter.charon.pid /var/run/dhclient-wlp2s0.pid
Bitte beachten Sie auch, dass grep
ist falsches Werkzeug für den Job. grep
dient zum Suchen von Textmustern in Textdateien, nicht in ihren Dateinamen.
Sie haben auch Folgendes erwähnt:
/ var / run speichert die im System ausgeführten Prozesse und enthält Dateien mit der PID-Erweiterung
Das ist eigentlich falsch. Prozessinformationen gehören in /proc
. Die .pid
-Dateien werden einfach von einigen Programmen verwendet um zu verhindern, dass mehrere Kopien desselben Prozesses ausgeführt werden (eine der möglichen Möglichkeiten, wie diese Dateien verwendet werden können). Siehe diesen Stapelüberlauf-Beitrag als Referenz sowie diese hoch bewertete Antwort auf unix.se. Während das Verzeichnis dem Root-Benutzer gehört, gehen Sie bitte nicht davon aus, dass es nur für Start- und Daemon-Apps gilt Root-Berechtigungen des Benutzers können genauso einfach in das Verzeichnis geschrieben werden.
Kommentare
- Verwenden von
/var/run/
vermeidet die Notwendigkeit von-L
. Denken Sie auch daran, dass Ubuntu 14 LTS Upstart verwendet und dass Upstart tatsächlich verhindert, dass mehrere Kopien desselben Programms als mehrere Prozesse ausgeführt werden. - @JdeBP Sorry,
find /var/run
allein funktioniert in meinem Fall nicht '.find --version
meldetfind (GNU findutils) 4.7.0-git
. Zumindest mit meiner Version von GNUfind
benötigt es das Flag-L
. Ich bin mir nicht sicher, wie BSDfind
mit Dingen umgeht. Gut zu wissen, dass etwa 14.04 Ubuntu ' die Upstart-Funktion ist, obwohl dies ' nicht bei Skripten hilft, die mehrere Kopien von self vermeiden möchten Zumindest auf askubuntu haben wir vorgeschlagen, dafür.pid
-Dateien zu verwenden. - Sie lesen schnell, was ich geschrieben habe. Lesen Sie es langsam noch einmal und notieren Sie die genaue Zeichenfolge. (-:
- @JdeBP Oh … Das Hinzufügen eines endgültigen Schrägstrichs funktioniert …