Jak uzyskać numer pid ostatniego wykonanego polecenia w skrypcie powłoki?

Chcę mieć taki skrypt powłoki:

my-app & echo $my-app-pid 

Ale tak nie wiem, jak uzyskać pid właśnie wykonanego polecenia.

Wiem, że mogę po prostu użyć polecenia jobs -p my-app, aby grepować pid. Ale jeśli chcę wykonać powłokę wiele razy, ta metoda nie zadziała. Ponieważ specyfikacja zadania jest niejednoznaczna.

Odpowiedź

PID ostatnio wykonanego polecenia znajduje się w $! zmienna powłoki:

my-app & echo $! 

Komentarze

  • Drukuje pid jak np. [1] 893. Chcę tylko liczby.
  • Należy zauważyć, że oznacza to programy uruchomione w tle . Jeśli żadne procesy w tle nie zostały uruchomione, parametr nie jest ustawiony.
  • Inne godne uwagi rozwiązanie jest sugerowane w (komentarz do odpowiedzi) Jak uzyskać pid właśnie rozpoczętego procesu : o, a " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 listopada ' 10 o 14:28
  • @ user3153014 Ciągi takie jak " [2] 2625 " są drukowane przez powłokę po uruchomieniu zadania w tle. Nie ma to związku z wyjściem echo $!
  • Zwykle używam takiego kodu w skrypcie, gdy muszę czekać na zakończenie procesu. my-app & myVar=$! ; fg. fg przenosi proces ponownie na pierwszy plan. Mogę wtedy wydrukować echo $myVar później i ' jestem prawie pewien, że moja aplikacja już się zakończyła.

Odpowiedź

Uzyskaj PID:

#!/bin/bash my-app & echo $! 

Zapisz PID w zmiennej:

#!/bin/bash my-app & export APP_PID=$! 

Zapisz wszystkie wystąpienia PID w pliku tekstowym:

#!/bin/bash my-app & echo $! >>/tmp/my-app.pid 

Zapisz dane wyjściowe, błędy i PID w oddzielnych plikach :

#!/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)" 

Komentarze

  • Pytanie nie ' nie pytaj o przekierowanie, wtedy twoja odpowiedź jest w większości taka sama jak zaakceptowana, z wyjątkiem tego, że jeśli instancja my-app zakończy się, a być może nawet gorzej, jego PID zostanie później ponownie użyty, ' Będziesz zawierał złe informacje w twoim pliku. Nie ' nie sądzę, aby ta odpowiedź dodała wiele wartości do istniejącej zaakceptowanej odpowiedzi naprawdę
  • @EricRenouf post został zaktualizowany!
  • kolejna pochodna, która może się przydać. Pobiera PID i jednocześnie traktuje go jako (głównie) proces pierwszoplanowy: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • isnt APP = main & sposób na pobranie PID?

Odpowiedź

Spróbuj czegoś takiego jak

pidof my_app >> /tmp/my_app.pid 

Komentarze

  • zewnętrzne polecenie i wolno, jeśli system może bezpośrednio podać PID, dlaczego przeszukuje wszystkie procesy w celu znalezienia właśnie tego ? a także, czy ' t mieć pewność, że ' uzyskasz prawidłową wartość

Odpowiedz

Spróbuj czegoś takiego:

 ps ef | grep "[m]y-app" | awk "{print $2}" 

Umieść pierwszą literę swojego procesu między [ ] zapewnia, że na liście nie ma procesu grep. W razie potrzeby możesz również dodać grep do swojej nazwy użytkownika.

Komentarze

  • To ' s bardzo w najlepszym razie kruchy i nie ' nie działa, jeśli my-app jest wykonywany więcej niż raz – davidshen84 szczególnie się tym martwi cas.
  • Jeśli nawet wybierzesz tę trasę, powinieneś zamiast tego użyć pgrep.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *