it-swarm.com.de

Wie Sie die aktuelle Linux-Prozess-ID von der Befehlszeile auf Shell-agnostische, sprachagnostische Weise erhalten

Wie erhält man ihre aktuelle Prozess-ID (pid) von der Linux-Befehlszeile auf eine Shell-agnostische, sprachagnostische Weise?

pidof(8) scheint keine Option zu haben, um den aufrufenden Prozess 'pid' abzurufen. Bash hat natürlich $$ - aber für meine generische Verwendung kann ich mich nicht auf eine Shell (Bash oder anders) verlassen. In einigen Fällen kann ich kein Skript oder ein kompilierbares Programm schreiben, daher funktionieren Bash/Python/C/C++ (usw.) nicht.

Hier ist ein spezieller Anwendungsfall: Ich möchte die pid des laufenden, Python-Fabric - basierten, entfernten SSH-Prozesses erhalten (wobei man vermeiden möchte, dass bash läuft), sodass ich unter anderem kopieren kann und/oder Dateien und/oder Verzeichnisse mit eindeutigen Dateinamen erstellen (wie in mkdir /tmp/mydir.$$).

Wenn wir das Fabric-spezifische Problem lösen können, ist das hilfreich - löst jedoch nicht mein langfristiges Problem. Für den allgemeinen Gebrauch in allen zukünftigen Szenarien möchte ich nur einen Befehl, der zurückgibt, was $$ in Bash liefert.

22
Johnny Utahh

Tolle Antworten + Kommentare hier und hier . Thx alles. Beides zu einer Antwort zusammenfassen und zwei Optionen mit Kompromissen in POSIX-Shell und nicht mit POSIX-Shell benötigten Kontexten bereitstellen:

  1. POSIX-Shell verfügbar: Verwenden Sie $$
  2. Allgemeine Cmdline: beschäftige cut -d ' ' -f 4 /proc/self/stat

Beispielsitzung mit beiden Methoden (zusammen mit anderen vorgeschlagenen, nicht funktionierenden Methoden) gezeigt here .

(Nicht sicher, wie relevant/nützlich es ist, sich so sehr darum zu kümmern, dass er unabhängig von Shell ist, aber er hat einfach oft die Einschränkung "Systemaufruf ohne Shell ausführen" erlebt, die jetzt nach Möglichkeit Shell-unabhängige Optionen sucht.

2
Johnny Utahh

Von Python:

$ python
>>> import os
>>> os.getpid()
12252
54

$$ ist nicht bash-spezifisch - ich glaube, dass er in allen POSIX-kompatiblen Shells verfügbar ist, was so ziemlich jeder Shell entspricht, die nicht absichtlich komisch ist.

8
duskwuff

Ich hoffe, das ist portabel genug, es hängt davon ab, dass die PPID das vierte Feld von /proc/[pid]/stat ist:

cut -d ' ' -f 4 /proc/self/stat

Es setzt ein Linux mit der richtigen Form von /proc voraus, dass sich das Layout von /proc/[pid]/stat nicht unverträglich von dem unterscheidet, was Debian 6.0.1 hat, dass cut eine separate ausführbare Datei und keine eingebaute Shell ist und dass der Schnitt keine Unterprozesse hervorbringt .

Alternativ können Sie Feld 6 anstelle von Feld 4 erhalten, um die PID des "Sitzungsleiters" zu erhalten. Interaktive Shells haben sich anscheinend als Sitzungsleiter festgelegt, und diese ID sollte über Pipes und Subshell-Aufrufe hinweg gleich bleiben:

$ echo $(echo $( cut -f 6 -d ' ' /proc/self/stat ) )
23755

$ echo $(echo $( cut -f 4 -d ' ' /proc/self/stat ) )
24027

$ echo $$
23755 

Das heißt, dies führt zu einer Abhängigkeit vom Verhalten der laufenden Shell - es muss die Sitzungs-ID nur dann festgelegt werden, wenn sie die PID ist, deren PID Sie wirklich möchten. Natürlich funktioniert das auch nicht in Skripten, wenn Sie möchten, dass die PID der Shell das Skript ausführt und nicht die interaktive.

7
millimoose

Weniger Charaktere und garantiert funktionieren:

sh -c 'echo $PPID'
1
Jordan Samuels

Wenn Sie Zugriff auf das proc-Dateisystem haben, ist/proc/self ein Symlink zum aktuellen/proc/$ pid. Sie können die PID beispielsweise aus der ersten Spalte von/proc/self/stat auslesen.

Wenn Sie sich in Python befinden, können Sie os.getpid () verwenden.

0
stew