Unbuffer połyka status wyjścia zabitego procesu

1

Oczekuje, że polecenie „unbuffer” połknie status wyjścia swojego dziecka, jeśli proces zostanie zabity. Czy można coś zrobić, aby zatrzymać to zachowanie? Nie połyka statusu wyjścia, jeśli proces potomny kończy działanie z niezerowym statusem wyjścia w ogóle.

Aby zobaczyć to zachowanie, rozważ 2 skrypty bash:

a.sh:

    exit 1

vs

b.sh:
    kill -11 $$

następnie usuń buforowanie na każdym z nich i wydrukuj $ ?. W pierwszym przypadku widzę 1, ale w drugim przypadku widzę 0, gdy oczekuję 139

frankc
źródło

Odpowiedzi:

3

Tak, musisz zmodyfikować skrypt „unbuffer”, aby zmienić sposób, w jaki „unbuffer” czeka na zakończenie procesu potomnego.

Z dokumentacji oczekiwanej:

Dodatkowe elementy mogą pojawić się na końcu wartości zwracanej z oczekiwania. Opcjonalny piąty element identyfikuje klasę informacji. Obecnie jedyną możliwą wartością dla tego elementu jest CHILDKILLED, w którym to przypadku dwie następne wartości to nazwa sygnału w stylu C i krótki opis tekstowy.

W skrypcie „unbuffer” poszukaj go exit [lindex [wait] 3]i zastąp go następującym kodem:

set result [wait]
send_user "wait returned: $result\n"
if { [llength $result] == 4 } {
    exit [lindex $result 3]
} else {
    exit 1
}

Po tej modyfikacji wyraźnie zobaczysz różnicę. Na przykład po uruchomieniu b.shskryptu otrzymasz coś takiego:

wait returned: 8606 exp6 0 0 CHILDKILLED SIGSEGV {segmentation violation}

Możesz oczywiście zmienić wartość o exit 1dowolną wartość. Możesz wyjść z 139, jeśli chcesz, ale wartość nie zmieni się, aby dopasować sygnał, chyba że dodasz jeszcze więcej kodu do skryptu „unbuffer”.

użytkownik210584
źródło