Ich möchte ein Shell-Skript wie dieses haben:
my-app & echo $my-app-pid
Aber das tue ich Ich weiß nicht, wie ich die PID des gerade ausgeführten Befehls abrufen soll.
Ich weiß, ich kann einfach den Befehl jobs -p my-app
verwenden, um die PID zu erfassen. Wenn ich die Shell jedoch mehrmals ausführen möchte, funktioniert diese Methode nicht. Weil die Jobspezifikation nicht eindeutig ist.
Antwort
Die PID des zuletzt ausgeführten Befehls befindet sich in der $!
Shell-Variable:
my-app & echo $!
Kommentare
- Es wird pid gedruckt, wie z. [1] 893. Ich möchte nur eine Nummer.
- Es sollte beachtet werden, dass dies für Programme steht, die im Hintergrund gestartet wurden. Wenn keine Hintergrundprozesse gestartet wurden, wird der Parameter nicht festgelegt.
- Eine andere sinnvolle Lösung wird in (ein Kommentar zu einer Antwort auf) vorgeschlagen. So erhalten Sie pid des gerade gestarteten Prozesses : oh, und der " Oneliner ":
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24. November ' 10 um 14:28 - @ user3153014 Zeichenfolgen wie " [2] 2625 " werden nach dem Start der Hintergrundaufgabe von der Shell gedruckt. Dies hängt nicht mit der Ausgabe von
echo $!
- zusammen. Normalerweise verwende ich solchen Code in einem Skript, wenn ich warten muss, bis der Prozess endet.
my-app & myVar=$! ; fg
.fg
bringt den Prozess wieder in den Vordergrund. Ich kann dann späterecho $myVar
drucken und ' bin mir ziemlich sicher, dass die my-app bereits fertig ist.
Antwort
Holen Sie sich PID
:
#!/bin/bash my-app & echo $!
Speichern Sie PID
in der Variablen:
#!/bin/bash my-app & export APP_PID=$!
Speichern Sie alle Instanzen PID
in Textdatei:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
Speichern Sie Ausgabe, Fehler und PID
in 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)"
Kommentare
- Die Frage wurde nicht ' Wenn Sie nicht nach der Umleitung fragen, ist Ihre Antwort meistens dieselbe wie die akzeptierte, außer dass Sie wenn eine Instanz von
my-app
beendet wird und die PID möglicherweise noch schlimmer später wiederverwendet wird div id = „8f160a87db“>
Ihre Datei enthält schlechte Informationen. Ich glaube nicht, dass ' diese Antwort der vorhandenen akzeptierten Antwort wirklich viel Wert hinzufügt.
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
`main &
eine Möglichkeit, die PID zu ermitteln? Antwort
Versuchen Sie etwas wie
pidof my_app >> /tmp/my_app.pid
Kommentare
- externer Befehl, und langsam, wenn das System PID direkt geben kann, warum alle Prozesse durchsucht werden, um genau das zu finden ? Außerdem kann ' nicht sicher sein, dass Sie ' den richtigen Wert
Versuchen Sie Folgendes:
ps ef | grep "[m]y-app" | awk "{print $2}"
Platzieren Sie den ersten Buchstaben Ihres Prozesses zwischen [
]
stellt sicher, dass der Prozess grep
nicht in Ihrer Liste enthalten ist. Bei Bedarf können Sie Ihrem Benutzernamen auch ein Grep hinzufügen.
Kommentare
- Das ' ist sehr bestenfalls zerbrechlich und ' funktioniert nicht, wenn
my-app
mehr als einmal ausgeführt wird – davidshen84 macht sich darüber speziell Sorgen cas. - Wenn Sie diesen Weg überhaupt gehen, sollten Sie stattdessen
pgrep
verwenden.