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?


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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.