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

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äter echo $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.

  • @EricRenouf post aktualisiert!
  • ein weiteres Derivat, das könnte nützlich sein. Dies erhält die PID und behandelt sie gleichzeitig als (meistens) Vordergrundprozess: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • ist nicht APP = 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
    Antwort

    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.

    Schreibe einen Kommentar

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