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-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
.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24 listopada ' 10 o 14:28echo $!
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.