Schreiben Sie eine PID-Datei manuell aus dem Bash-Skript

10

Wie könnte ich ein Bash-Skript schreiben, das ein lang laufendes Programm ausführt und die Prozess-ID des Programms in einer separaten Datei speichert?

Ich möchte so etwas wie

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

Wenn Sie dies jedoch genau tun, wird das psAfter- Tool ausgeführt .

Gibt es eine Möglichkeit, die Prozess-ID des erstellten Prozesses abzurufen?

DerMike
quelle
2
Ihr Beispielcode funktioniert nicht, da exec nicht verzweigt, sodass der Shell-Prozess durch den long_running_toolProzess ersetzt wird. Folglich kehrt exec niemals zurück und die folgende Zeile wird niemals erreicht. Siehe help exec, execve(2).
Etienne Dechamps
@ e-t172 Danke für den Hinweis. Ich lösche dann 'exec'.
DerMike
2
Siehe Prozessmanagement .
Bis auf weiteres angehalten.

Antworten:

12

Sie können den Prozess einfach im Hintergrund mit "&" ausführen und dann die PID des Hintergrundprozesses mit "$!"

#!/bin/bash
long_running_tool &
echo $! > pid_file

Dann warten Sie optional $! Wenn Sie möchten, dass die Shell blockiert, bis der Prozess die Ausführung abgeschlossen hat.

Jeremy Sturdivant
quelle
1
UPDATE: Wenn ich die fg verwende, erhalte ich 'fg: 21: job (null) nicht unter Jobkontrolle erstellt' und das Skript blockiert nicht. Es tut uns leid.
DerMike
"warte $!" sollte einen ähnlichen Effekt wie fg haben, den ich bestätigen kann, funktioniert tatsächlich in einem Skript. Ich hätte das wahrscheinlich vor dem Posten überprüfen sollen. >.> mein schlechtes.
Jeremy Sturdivant
9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Wie bereits erwähnt, exec ersetzt bash mit dem angegebenen Programm, Beibehaltung des PID.

user1686
quelle