Wie erhalte ich die PID des zuletzt ausgeführten Befehls im Shell-Skript?

254

Ich möchte ein Shell-Skript wie das folgende haben:

my-app &
echo $my-app-pid

Aber ich weiß nicht, wie die pid des gerade ausgeführten Befehls erhalten wird.

Ich weiß, ich kann nur den jobs -p my-appBefehl verwenden, um die PID zu greifen. Wenn ich die Shell jedoch mehrmals ausführen möchte, funktioniert diese Methode nicht. Weil die Jobspezifikation nicht eindeutig ist.

David S.
quelle

Antworten:

338

Die PID des zuletzt ausgeführten Befehls befindet sich in der $!Shell-Variablen:

my-app &
echo $!
Enzotib
quelle
1
Es wird pid gedruckt wie zB. [1] 893 Ich will nur nummer
user3153014
33
Es ist zu beachten, dass dies für im Hintergrund gestartete Programme steht . Wurden keine Hintergrundprozesse gestartet, wird der Parameter nicht gesetzt.
Ramrunner
5
Eine weitere würdige Lösung wird in (einen Kommentar zu einer Antwort auf) vorgeschlagen Wie pid von gerade begonnen Prozess zu bekommen : oh, und die „oneliner“: /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24. November '10 um 14:28 Uhr
IMZ - Ivan Zakharyaschev
14
@ user3153014 Zeichenfolgen wie "[2] 2625" werden nach dem Starten der Hintergrundaufgabe von der Shell gedruckt. Dies hat nichts mit der Ausgabe vonecho $!
Petr Gladkikh zu tun.
Normalerweise verwende ich solchen Code in einem Skript, wenn ich warten muss, bis der Prozess endet. my-app & myVar=$! ; fg. fgbringt den Prozess wieder in den Vordergrund. Ich kann dann echo $myVarspäter drucken und bin mir ziemlich sicher, dass die my-app bereits fertig ist.
Vrata Blazek
66

Erhalten Sie PID:

#!/bin/bash
my-app &
echo $!

PIDIn Variable speichern :

#!/bin/bash
my-app &
export APP_PID=$!

Speichern Sie alle Instanzen PIDin einer Textdatei:

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

Speichern Sie die Ausgabe, Fehler und PIDin getrennten Dateien:

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"
Eduardo Cuomo
quelle
3
Die Frage wurde nicht nach der Umleitung gestellt. Ihre Antwort ist dann meist die gleiche wie die akzeptierte, mit der Ausnahme, dass wenn eine Instanz von my-appbeendet wird und möglicherweise, noch schlimmer, ihre PID später wiederverwendet wird, Sie schlechte Informationen in Ihrer Datei haben. Ich denke nicht, dass diese Antwort wirklich viel Wert für die bestehende akzeptierte Antwort bringt
Eric Renouf,
@EricRenouf Beitrag aktualisiert!
Eduardo Cuomo
ein anderes Derivat, das nützlich sein könnte. Dadurch wird die PID sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
abgerufen
ist nicht APP = main &ein Weg, um PID zu greifen?
MrMesees
3

Versuchen Sie etwas wie

pidof my_app >> /tmp/my_app.pid
Piyush Jain
quelle
1
Externer Befehl und langsam, wenn das System PID direkt angeben kann, warum alle Prozesse durchsuchen, um genau das zu finden? und ich kann auch nicht sicher sein,
ob
-4

Versuchen Sie so etwas:

 ps ef | grep "[m]y-app" | awk '{print $2}'

Wenn Sie den ersten Buchstaben Ihres Prozesses dazwischen setzen [ ], stellen Sie sicher, dass Sie den grepProzess nicht in Ihre Liste aufnehmen. Bei Bedarf können Sie Ihrem Benutzernamen auch ein Grep hinzufügen.

Goez
quelle
9
Das ist sehr zerbrechlich besten und funktioniert nicht , wenn my-appmehr als einmal ausgeführt wird - davidshen84 speziell über diese cas Sorgen.
Mat
2
Wenn Sie diesen Weg überhaupt gehen, sollten Sie pgrepstattdessen verwenden.
Willem