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


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.


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

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


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


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)


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.


@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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.