Załóżmy na przykład, że uruchamiam polecenie w jednej sesji powłoki bash -c 'apt-get update && apt-get upgrade'
. 5 minut później postanawiam wyjść na przekąskę i zdaję sobie sprawę, że zapomniałem dodać mechanizmu powiadamiania o tym, czy wyjście było sukcesem, czy porażką.
Co mam teraz zrobić? Gdybym tylko mógł zapytać z innego terminala o status wyjścia tego innego polecenia (a konkretnie tego PID), może mógłbym mimo wszystko wyświetlić jakieś wyskakujące okienko. Pytanie brzmi: w jaki sposób mogę sprawdzić status wyjścia już uruchomionego procesu z innego terminala?
Innymi słowy,
PODAJĄC, że mam uruchomiony proces w terminalu A ORAZ jego PID jest znany
KIEDY wykonuję jakieś polecenie w terminalu B
Następnie powinienem wiedzieć, czy proces w terminalu A kończy się ze statusem wyjścia 0 lub statusem wyjścia> 1.
źródło
wait
aby uzyskać kod procesu działającego w tle w bieżącej powłoce po jej zakończeniu, ale nie mogłem znaleźć niczego, co pozwalałoby na zapytanie innych powłok. Samo monitorowanie, czy proces nadal działa i generowanie alertu po jego zakończeniu, jest znowu trywialne, ale nie znajduje kodu wyjścia. Jedyny sposób, jaki mogłem wymyślić, wymagałby przygotowania powłokiPROMPT_COMMAND
do przechowywania ostatniego kodu wyjścia w pliku tymczasowym lub w podobnej dostępnej lokalizacji. Czy to byłaby opcja?Odpowiedzi:
Użyj
strace
w następujący sposób:Żadne wywołania systemowe ani sygnały nie są tu interesujące, więc mówimy,
strace
aby zignorować je-e
wyrażeniami i ukryć komunikat o statusie za pomocą-q
.strace
dołącza się do procesu z PID$PID
, czeka, aż zakończy się normalnie i wysyła swój status wyjścia w następujący sposób:Prostym
if
wyrażeniem wywołującym dowolne powiadomienie może być:Przykładowy przebieg
Większość zasług pochodzi z tej odpowiedzi w U&L , proszę zostawić tam głosowanie, jeśli uznasz to za przydatne.
źródło