Asynchroniczne polecenia powłoki

100

Próbuję użyć skryptu powłoki, aby uruchomić polecenie. Nie obchodzi mnie, czy / kiedy / jak / dlaczego to się kończy. Chcę, aby proces został uruchomiony i uruchomiony, ale chcę mieć możliwość natychmiastowego powrotu do mojej powłoki ...

LorenVS
źródło
2
Powiązane, zobacz Różnica między nohup, disown i & na Unix i Linux Stack Exchange.
jww
1
Dla tych, którzy poszukują bardziej dogłębnej odpowiedzi, że rozmowy na temat różnic między nohup, &idisown , kliknij tutaj, aby przejść do czwartego odpowiedź .
noɥʇʎԀʎzɐɹƆ

Odpowiedzi:

116

Możesz po prostu uruchomić skrypt w tle:

$ myscript &

Zauważ, że różni się to od umieszczania &wewnątrz skryptu, który prawdopodobnie nie zrobi tego, co chcesz.

Carl Norum
źródło
1
Wiedziałem, że to będzie coś łatwego, wielkie dzięki ... Linux po prostu nie jest moją rzeczą, ale staram się przyspieszyć ... Przy okazji, czy to zadziała w połączeniu z nohup?
LorenVS
2
Jaka jest różnica między umieszczeniem znaku & w wierszu poleceń a umieszczeniem go w skrypcie? Nie zdawałem sobie sprawy, że są inni.
Jacob Sharf,
8
@JacobSharf, spróbuj, a zobaczysz. Jeśli &znajduje się wewnątrz skryptu, a nie masz wait, polecenie w tle zostanie zabite po zakończeniu działania skryptu.
Carl Norum,
O. To wiele wyjaśnia. Niedawno zauważyłem pewien efekt, który mógłby być przez to spowodowany. Googlowanie to faktycznie doprowadziło mnie do tej strony. Dzięki
Jacob Sharf,
Jeśli myscriptmodyfikuje środowisko terminala, np. jest to polecenie inicjalizacji terminala, które nie jest potrzebne natychmiast i może zostać opóźnione, czy nadal będzie modyfikować środowisko terminala?
noɥʇʎԀʎzɐɹƆ
58

Wszyscy po prostu zapomnieli disown. Oto podsumowanie:

  • & umieszcza pracę w tle.

    • Blokuje przy próbie odczytania danych wejściowych i
    • Sprawia, że ​​powłoka nie czeka na zakończenie.
  • disown usuwa proces z kontroli zadań powłoki, ale nadal pozostawia go połączonego z terminalem.

    • Jednym z rezultatów jest to, że powłoka nie wyśle ​​jej a SIGHUP(jeśli powłoka otrzyma a SIGHUP, wysyła również SIGHUPdo procesu, co normalnie powoduje zakończenie procesu).
    • I oczywiście można go zastosować tylko do zadań w tle (ponieważ nie można go wprowadzić, gdy jest uruchomione zadanie pierwszego planu).
  • nohupodłącza proces od terminala, przekierowuje jego wyjście nohup.outi chroni go przed SIGHUP.

    • Proces nie otrzyma żadnych wysłanych SIGHUP.
    • Jest całkowicie niezależny od kontroli zadań i zasadniczo może być używany również do zadań pierwszoplanowych (chociaż nie jest to zbyt przydatne).
    • Zwykle używany z &(jako praca w tle).
Ani Menon
źródło
Nie mogę znaleźć disownw Debianie lub OS X. Myślałem, że to program, ale wydaje mi się, że się mylę. Co to jest?
jww
disown command i na OSX
Ani Menon
6
To najlepsza odpowiedź. Najbardziej wszechstronny.
noɥʇʎԀʎzɐɹƆ
3
Zdecydowanie najlepsza odpowiedź, nie wiem, dlaczego tak małe
wzrosty
1
@VladGanshin No.
Ani Menon
39
nohup cmd

nie zawiesza się po zamknięciu terminala. wyjście domyślnie trafia do nohup.out

Możesz to połączyć z tłem,

nohup cmd &

i pozbądź się wyniku,

nohup cmd > /dev/null 2>&1 &

możesz także disownrozkaz. typ cmd, Ctrl-Z, bg,disown

Steve B.
źródło
2
Fajne, szalone, jak wszystko się łączy, myślę, że kolejność do mnie dotarłaby na początku, ale przypuszczam, że możesz to po prostu zapamiętać (co napisałeś lub "nohup cmd &> / dev / null 2> & 1" :))
LorenVS
Natknąłem się na to dziś wieczorem. Walczę ze skryptem powłoki od 2 dni i ta sugestia sprawiła, że ​​wszystko działa. Dziękuję bardzo!
JD Long
Świetnie, to jest bardzo przydatne. Podczas pracy w tle możesz od czasu do czasu sprawdzać wyniki polecenia, używając tail nohup.out, spowoduje to wyświetlenie ostatnich 10 wierszy wyniku polecenia. Używam tego do zadań tworzenia kopii zapasowych rsync, aby zobaczyć, w jakim pliku obecnie się znajduje.
Martin Hansen
Co się stanie, jeśli to zrobię, ale zechcę zatrzymać proces w tle?
Stephan Bijzitter
Powłoka drukuje identyfikator zadania, kiedy zaczynasz zadanie właśnie w tym celu. W dowolnym momencie możesz zobaczyć swoje uruchomione zadania za pomocą jobs.
tripleee
26

Alternatywnie, po uruchomieniu programu, możesz nacisnąć Ctrl-Z, co spowoduje zatrzymanie programu, a następnie wpisz

bg

co powoduje umieszczenie ostatniego zatrzymanego programu w tle. (Przydatne, jeśli zacząłeś coś bez `` & '' i nadal chcesz to w backgroung bez ponownego uruchamiania)

pajton
źródło
2
Dzięki, to fajna mała sztuczka ... Zaczynam naprawdę doceniać trochę dobroci powłoki ...
LorenVS
3

screen -m -d $command$uruchamia polecenie w odłączonej sesji. Możesz użyć, screen -raby dołączyć do rozpoczętej sesji. To wspaniałe narzędzie, niezwykle przydatne także podczas sesji zdalnych. Przeczytaj więcej na man screen.

mluthra
źródło
@LadenkovVladislav Jestem w 95% pewien, że możesz zainstalować screen na RedHacie. Mam na CentOS.
BuvinJ
W Ubuntu chciałem emulować polecenie "start" systemu Windows / batch. To znaczy asynchronicznie uruchamia program pierwszego planu (gui) i kontynuuje za pomocą skryptu powłoki. To właśnie robi.
BuvinJ