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.
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.
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?