a potem pragnij, aby umieścić go w tle. Wpisanie Ctrl+, Za następnie bgwykonuje lewę, ale zawiesi się foomiędzy Ctrl+ Za bg. Jak mogę umieścić Foo w tle bez uprzedniego zamrożenia?
Jaki jest przypadek użycia? Dlaczego problem zawiesza się na krótki czas?
l0b0
Odpowiedzi:
4
Technicznie foojuż działa w tle. Możesz rozpocząć drugą sesję terminalową, a pierwsza będzie kontynuowana foopodczas wykonywania innych czynności.
W X oznacza to po prostu uruchomienie drugiej aplikacji terminala lub otwarcie innej karty, jeśli wybrany emulator terminala ma takie funkcje.
Jeśli nie planowałeś tego na konsoli, musisz przełączyć się na inny terminal wirtualny i zalogować się ponownie.
Jeśli korzystasz z terminala typu multiplekser screenlub tmuxmożesz rozpocząć w nim inną sesję. Na przykład na ekranie wykonuje się to za pomocą Ctrl+, Aa następnie Ctrl+ C. Aby przełączać się między nimi, używaj Ca Cn i Ca Cp, aby przechodzić między sesjami terminalowymi.
Ta odpowiedź wydaje się opierać na niezrozumieniu koncepcji pracy w tle. Terminal ma atrybut „pierwszoplanowej grupy procesów”, zwykle ustawiany przez powłokę, co sprawia, że procesy w tej grupie są w stanie czytać z terminala i odbierać sygnały związane z tty, takie jak SIGINT. Wszystkie procesy działające na terminalu, które nie należą do grupy procesów pierwszego planu, są procesami w tle. Podczas tworzenia nowego terminala zadanie pierwszego planu oryginalnego terminala jest nadal zadaniem pierwszoplanowym w tym terminalu, nawet jeśli na niego nie patrzysz.
@ WumpusQ.Wumbley Chodzi mi o to, że większość (wszystkich?) Systemów, które potrafią uruchamiać bash, są z natury wielozadaniowe. W takim systemie, nawet jeśli proces, powiedzmy, koncentruje się na danych wejściowych, sam proces nie ma z natury „nowej wiedzy” ; foosamo (brak specyficznego sprawdzania, które jak sądzę na wolności jest gdzieś pomiędzy rzadkim a nieistniejącym) nie przejmuje się tym, czy działa w najwyższym oknie, czy nawet czy coś wyświetla jego wynik.
CVn
1
Chodzi mi o to, że kiedy pytanie konkretnie wspomina słowa „tło” i „zadanie” - oba są terminami technicznymi o znaczeniu zdefiniowanym przez strukturę grupy procesów POSIX - a także mechanizmy Ctrl-Z i bg, z których oba działają na grupach procesów - a twoja odpowiedź sugeruje, że w ogóle nie używasz funkcji grupy procesów, a słowa „tło” używasz w sposób niezgodny z ich rzeczywistą definicją - nie dopasowujesz swojej odpowiedzi do pytania. I na początek „Technicznie foojuż działa w tle” ... po prostu ... Nie. Technicznie.
@ WumpusQ.Wumbley Jakoś nie sądzę, że OP przeczytał standard POSIX i pomyślał „hmm, chciałbym tego użyć, ale już zacząłem, foowięc co mam teraz robić?”. Jeśli uważasz, że ta odpowiedź (lub inne odpowiedzi) nie jest przydatna w odpowiedzi na pytanie, zachęcam do skorzystania z uprawnień do głosowania, a także do pozostawienia odpowiedzi z własnej odpowiedzi na pytanie pod właściwym kątem, a nie kłócił się o jedną z odpowiedzi pozostawionych na pytanie. Może uważasz, że na przykład odpowiedź l0b0 jest lepsza, ale moja odpowiedź oferuje sposób na zrobienie przynajmniej mniej więcej tego, czego chce OP.
CVn
3
Dodanie &znaku po poleceniu ( foo &) spowoduje natychmiastowe umieszczenie go w tle. Uważam jednak, że w standardowej konfiguracji terminala / powłoki nie ma możliwości natychmiastowego ustawienia tła w tle, gdy zostanie ono ujawnione.
Wysłanie aplikacji z pierwszego planu do tła wymaga współpracy zarówno terminala, jak i powłoki. Terminal nie może tego zrobić sam, ponieważ powłoka musi ustawić grupę procesów pierwszego planu. Powłoka nie może tego zrobić sama, ponieważ terminal musi przetworzyć naciśnięcie klawisza (powłoka nie jest na pierwszym planie, więc nie może odebrać naciśnięcia klawisza).
Mam konfigurację zsh, w której mogę szybko nacisnąć dwukrotnie Ctrl+ Z; pierwsza prasa zawiesza proces, a druga prasa wznawia go w tle. Nie wiem, jak go przenieść do basha.
Jeśli pracujesz w emulatorze terminali, który pozwala ci wstrzykiwać naciśnięcia klawiszy, możesz wstrzykiwać ^Zbg^M(używając ^notacji dla znaków kontrolnych). Na przykład, z emulatorem terminala X11, uruchom xdotool --window 1234 Ctrl_L+Z b g Returngdzie 1234 to identyfikator okna emulatora terminala. W Screen, uruchom screen -S foo -p 12 -X stuff $'\032bg\r'gdzie foojest nazwa sesji ekranu i 12identyfikator okna.
Jeśli wpisanie nie jest wystarczająco szybkie dla sprawy, uruchom kill -s SIGSTOP 1023 && kill -s SIGCONT 1023z innej powłoki, zakładając 1023 jako docelowy PID.
ZASTRZEŻENIE: Jak zapewne wiedział Ruslan , ta sekwencja faktycznie uruchamia zadanie tak szybko, bashże go nie zauważa.
Odpowiedzi:
Technicznie
foo
już działa w tle. Możesz rozpocząć drugą sesję terminalową, a pierwsza będzie kontynuowanafoo
podczas wykonywania innych czynności.W X oznacza to po prostu uruchomienie drugiej aplikacji terminala lub otwarcie innej karty, jeśli wybrany emulator terminala ma takie funkcje.
Jeśli nie planowałeś tego na konsoli, musisz przełączyć się na inny terminal wirtualny i zalogować się ponownie.
Jeśli korzystasz z terminala typu multiplekser
screen
lubtmux
możesz rozpocząć w nim inną sesję. Na przykład na ekranie wykonuje się to za pomocą Ctrl+, Aa następnie Ctrl+ C. Aby przełączać się między nimi, używaj Ca Cn i Ca Cp, aby przechodzić między sesjami terminalowymi.źródło
foo
samo (brak specyficznego sprawdzania, które jak sądzę na wolności jest gdzieś pomiędzy rzadkim a nieistniejącym) nie przejmuje się tym, czy działa w najwyższym oknie, czy nawet czy coś wyświetla jego wynik.foo
już działa w tle” ... po prostu ... Nie. Technicznie.foo
więc co mam teraz robić?”. Jeśli uważasz, że ta odpowiedź (lub inne odpowiedzi) nie jest przydatna w odpowiedzi na pytanie, zachęcam do skorzystania z uprawnień do głosowania, a także do pozostawienia odpowiedzi z własnej odpowiedzi na pytanie pod właściwym kątem, a nie kłócił się o jedną z odpowiedzi pozostawionych na pytanie. Może uważasz, że na przykład odpowiedź l0b0 jest lepsza, ale moja odpowiedź oferuje sposób na zrobienie przynajmniej mniej więcej tego, czego chce OP.Dodanie
&
znaku po poleceniu (foo &
) spowoduje natychmiastowe umieszczenie go w tle. Uważam jednak, że w standardowej konfiguracji terminala / powłoki nie ma możliwości natychmiastowego ustawienia tła w tle, gdy zostanie ono ujawnione.źródło
Wysłanie aplikacji z pierwszego planu do tła wymaga współpracy zarówno terminala, jak i powłoki. Terminal nie może tego zrobić sam, ponieważ powłoka musi ustawić grupę procesów pierwszego planu. Powłoka nie może tego zrobić sama, ponieważ terminal musi przetworzyć naciśnięcie klawisza (powłoka nie jest na pierwszym planie, więc nie może odebrać naciśnięcia klawisza).
Mam konfigurację zsh, w której mogę szybko nacisnąć dwukrotnie Ctrl+ Z; pierwsza prasa zawiesza proces, a druga prasa wznawia go w tle. Nie wiem, jak go przenieść do basha.
Jeśli pracujesz w emulatorze terminali, który pozwala ci wstrzykiwać naciśnięcia klawiszy, możesz wstrzykiwać
^Zbg^M
(używając^
notacji dla znaków kontrolnych). Na przykład, z emulatorem terminala X11, uruchomxdotool --window 1234 Ctrl_L+Z b g Return
gdzie 1234 to identyfikator okna emulatora terminala. W Screen, uruchomscreen -S foo -p 12 -X stuff $'\032bg\r'
gdziefoo
jest nazwa sesji ekranu i12
identyfikator okna.źródło
Jeśli wpisanie nie jest wystarczająco szybkie dla sprawy, uruchom
kill -s SIGSTOP 1023 && kill -s SIGCONT 1023
z innej powłoki, zakładając 1023 jako docelowy PID.ZASTRZEŻENIE: Jak zapewne wiedział Ruslan , ta sekwencja faktycznie uruchamia zadanie tak szybko,
bash
że go nie zauważa.źródło