Uruchom skrypt Bash w tle i zakończ terminal

19

Czy można uruchomić terminal lub polecenie zakończenia skryptu Bash i NIE przerywać polecenia?

Moim rozwiązaniem było uruchomienie crona o określonej porze dnia, ale jestem pewien, że jest coś łatwiejszego.

Peter Mortensen
źródło

Odpowiedzi:

45

Aby uniknąć propagacji sygnałów wyjściowych do procesów potomnych terminala i powłoki, uruchom polecenie za pomocą nohup, tj .:

nohup cmd &
Thor
źródło
1
To jest poprawna odpowiedź. Bez żadnych zmian rozpoczęty proces jest nadal uważany za „potomek” procesu terminalnego, a zatem zostaje zakończony, jeśli terminal jest zamknięty.
Izzy
3
cmd & disowndziała również, ponieważ &traktowane jest jak ;separator poleceń. Polecenie disown usuwa połączenie między sesją powłoki bash a poleceniem w tle.
lornix,
2
zsh posiada skrót do tego: cmd &|.
Thor
Aby to zadziałało, musiałem zmienić preferencje w Terminal.app. W obszarze Profile wybierz aktywny profil, a następnie Powłoka> Po wyjściu z powłoki> Zamknij, jeśli powłoka została poprawnie wyjęta
antoine
6

Używanie screen:

screen -S <session name> -d -m <your command>

po tym możesz wyjść z terminala, a także ponownie podłączyć się do niego przez:

screen -r <session name>

Więcej informacji: odniesienie

Bruce
źródło
4

Jeśli chcesz uruchamiać określone polecenie lub plik co sekundę w tle po wyjściu z terminala, możesz wypróbować tę łatwą drobiazg;

nohup watch -n5 'bash script.sh' &

To uruchamiałoby scipt.sh co 5 sekund.

jamietelin
źródło
1
„nohup” jest już objęte zaakceptowaną odpowiedzią. I jestem prawie pewien, że pytający wspomniał o cronie, ponieważ używali go do powiedzenia „Uruchom to polecenie na kilka sekund w przyszłości”, a nie do okresowego uruchamiania.
David Richerby,
1
Moja odpowiedź nie pogarsza sytuacji. Widzę sens głosowania w dół. Neuron byłby wystarczający.
jamietelin,
3

Po swoim poleceniu umieść znak „&”.

na przykład:

/home/your/script.sh &
Flinth
źródło
7
w tym przypadku, gdy terminal jest zamknięty, proces rozpoczyna się /home/your/script.sh- ponieważ nie został odłączony od swojego „rodzica”, ale po prostu „w tle”. Użyj, nohupaby odłączyć go naprawdę.
Izzy
Szkoda, nie wiedziałem o tym, ale kiedy testowałem na moim Debianie, polecenie kontynuowało wykonywanie po zamknięciu powłoki, która go uruchomiła: /
Flinth
1
Nie jestem pewien, gdzie dokładnie i kiedy jest dołączony proces w tle. Ale jeśli np. Zalogujesz się na maszynie zdalnej, zostanie ona z pewnością zatrzymana natychmiast po wylogowaniu (z wyjątkiem sytuacji, gdy zdemonizuje się sama). Tak więc, aby mieć 100% pewności, wolisz użyć nohup- która rejestruje również wszystkie (teraz niewidoczne) dane wyjściowe w pliku o nazwie nohup.outznajdującym się w katalogu, z którego uruchomiono polecenie.
Izzy
Dobrze, dziękuję za wyjaśnienia ^^
Flinth
Ta odpowiedź może działać poprawnie w połączeniu z jobspoleceniem. Dość często chcę móc powrócić do procesu powłoki po tle.
djangofan,