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ź
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-appzakoń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-appjest wykonywany więcej niż raz – davidshen84 szczególnie się tym martwi cas. - Jeśli nawet wybierzesz tę trasę, powinieneś zamiast tego użyć
pgrep.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &– sysfault 24 listopada ' 10 o 14:28echo $!my-app & myVar=$! ; fg.fgprzenosi proces ponownie na pierwszy plan. Mogę wtedy wydrukowaćecho $myVarpóźniej i ' jestem prawie pewien, że moja aplikacja już się zakończyła.