Napisz ręcznie plik PID ze skryptu Bash

10

Jak napisać skrypt Bash, który uruchamia długo działający program i przechowuje identyfikator procesu programu w osobnym pliku?

Chcę coś takiego

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

Jednak wykonanie tego dokładnie spowoduje wykonanie narzędziaps po zakończeniu.

Czy istnieje sposób na uzyskanie identyfikatora procesu utworzonego?

DerMike
źródło
2
Twój przykładowy kod nie będzie działał, ponieważ exec nie rozwidla się, więc proces powłoki jest zastępowany przez long_running_toolproces. W związku z tym exec nigdy nie powraca i nigdy nie zostaje osiągnięty następujący wiersz. Zobacz help exec, execve(2).
Etienne Dechamps
@ e-t172 dziękuję za zwrócenie uwagi. Następnie usuwam „exec”.
DerMike 27.01.11
2
Zobacz Zarządzanie procesami .
Wstrzymano do odwołania.

Odpowiedzi:

12

Możesz łatwo uruchomić proces w tle za pomocą „&”, a następnie uzyskać PID procesu w tle za pomocą „$!”

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

Następnie opcjonalnie poczekaj $! jeśli chcesz, aby powłoka blokowała się, dopóki proces nie zakończy wykonywania.

Jeremy Sturdivant
źródło
1
AKTUALIZACJA: kiedy używam fg, dostaję „fg: 21: zadanie (null) nie utworzone pod kontrolą zadania” i skrypt nie blokuje się. Przepraszam.
DerMike 27.01.11
„czekaj $!” powinien mieć podobny efekt do fg, który mogę potwierdzić, że faktycznie działa w skrypcie. Prawdopodobnie powinienem to sprawdzić przed opublikowaniem. >.> mój zły.
Jeremy Sturdivant
9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Jak wspomniano wcześniej, exec zastępuje bash go określonym programem, zachowując PID.

użytkownik1686
źródło