Zadania w tle w skryptach powłoki

0

Mam skrypt powłoki script.shz poleceniem cmduruchomionym w tle, to znaczy:

#!/bin/bash

cmd &

Jeśli otworzę emulator terminala (próbowałem xfce4-terminal i gnome-terminal) i uruchomię się script.shw nim, moje polecenie cmdzostanie skutecznie wykonane i wykonane w tle, zgodnie z oczekiwaniami.

Ale jeśli otworzę emulator terminala z poprzedniej (lub na początku sesji pulpitu, co jest moim prawdziwym przypadkiem użycia) i wykonam skrypt przez

xfce4-terminal -H -x script.sh (or gnome-terminal -x script.sh)

polecenie cmdnie jest już wykonywane.

Przekonałem się, że mogę zmusić go do wykonania poprzez umieszczenie set -mw moim skrypcie, ale nie rozumiem, dlaczego jest to konieczne (ani w rzeczywistości wystarczające) w tym przypadku, a nie w poprzednim. Rzeczywiście, jeśli wstawię a set -odo skryptu, uzyskam taki sam wynik w obu przypadkach.

Czy ktoś może mi to wyjaśnić i / lub powiedzieć właściwy sposób wykonywania zadań w tle w skryptach powłoki? Dzięki!


EDYCJA: W rzeczywistości cmdjest wykonywana w obu przypadkach, ale w drugim przypadku jest natychmiast zabijana przez zakończenie script.sh. Aby temu zapobiec, można użyć nohup, ale to nie wystarczy, i jest to dla mnie najdziwniejsza rzecz: trzeba także postawić sleep 1coś takiego, aby umożliwić prawidłowe uruchomienie procesu w tle i odłączenie od powłoki nadrzędnej, w przeciwnym razie zostanie zabity.

Naprawdę nie rozumiem tej różnicy w zachowaniu między dwiema powłokami, ponieważ obie nie są interaktywne, jak stwierdzono w poprzednim komentarzu.

Glif
źródło
Skąd masz pewność, że cmdsię nie wykonuje? Czy można go łatwo i jednoznacznie znaleźć w wyjściu ps (i trwa wystarczająco długo, aby go znaleźć), czy też wydaje dźwięk lub inne wskazanie GUI?
Xen2050,
@ Xen2050 Zazwyczaj wybieram cmdcoś, co można zobaczyć w menedżerze zadań, na przykład sleep nprzy nwystarczająco dużym rozmiarze . Ale można wybrać coś z GUI, jak firefoxlub coś innego.
Glyph

Odpowiedzi:

1

Jeśli otworzysz xfce4-trminallub gnome-terminal(lub inny terminal) Twoja powłoka jest w trybie interaktywnym. Każdy skrypt jest uruchamiany w trybie interaktywnym.

W przypadku uruchomienia script.shprzez

xfce4-terminal -H -x script.sh

lub

gnome-terminal -x script.sh

lub inny terminal, Twoja powłoka jest w trybie nieinteraktywnym.

Skrypty mogą być zmuszane do działania w trybie interaktywnym z -iopcją lub z #!/bin/bash -inagłówkiem. Należy pamiętać, że może to powodować nieprawidłowe zachowanie skryptu lub wyświetlanie komunikatów o błędach, nawet jeśli nie występuje błąd.

Co to jest set -m? To tryb monitorowania . Procesy działające w tle działają w osobnej grupie procesów, a po ich zakończeniu drukowany jest wiersz zawierający ich status wyjścia. Jest domyślnie włączony dla interaktywnych powłok.

Co to jest set -o? Zapisuje bieżące ustawienia opcji na standardowe wyjście w nieokreślonym formacie.

Dlaczego set -odziała

Opcja −o została przyjęta z KornShell w celu zaspokojenia potrzeb użytkowników. Oprócz ogólnie przyjaznego interfejsu, −o jest potrzebne do zapewnienia trybu edycji wiersza poleceń vi, dla którego praktyka historyczna nie daje nazwy opcji jednoliterowej. (Chociaż możliwe było wynalezienie takiej litery, uznano, że zostaną opracowane inne tryby edycji i −o zapewnia wystarczającą przestrzeń nazw dla opisywania takich rozszerzeń.)

Historyczne implementacje są niespójne w formacie stosowanym do raportowania statusu opcji -o. Dodano format + o bez argumentu opcji, aby umożliwić przenośny dostęp do opcji, które można zapisać, a następnie przywrócić za pomocą, na przykład, skryptu kropkowego.

W każdym razie set -mjest to preferowany sposób.

Tomasz Jakub Rup
źródło
Nie… powłoka w twoim terminalu jest interaktywna, ale ta, która została wywołana w celu uruchomienia skryptu, nie jest. To właśnie obserwuję, w szczególności poprzez włączenie set -omojego skryptu: w obu przypadkach jego wynik jest taki sam, w szczególności w przypadku trybu monitorowania, który jest wyłączony (domyślnie w trybie nieinteraktywnym). Nie set -osprawdzam, czy to działa, ale aby zobaczyć jego wyniki.
Glyph
0

Odpowiedzi na pytanie udzielił Unix Stackexchange (patrz także dodatkowe komentarze poniżej odpowiedzi). To pytanie, kto wysyła sygnał SIGHUP do kogo i kiedy. I alternatywą dla set -m / set +mdookoła cmd &w script.shto trap '' HUP / trap - HUP.

Glif
źródło