Jak wysyłasz aplikacje wiersza poleceń bezpośrednio w tle?


22

Wiem już, że naciśnięcie ctrl+zzatrzymuje aplikację, a następnie mogę wysłać aplikację do tła za pomocą bgpolecenia, ale oznacza to, że aplikacja jest zatrzymana przez krótki czas.

Jak wysłać aplikację bezpośrednio w tło, nie przerywając jej?


Z pewnością nie możesz, jeśli już działa.
Kevin

1
Jeśli twoje zadanie wymaga wprowadzenia „przed zniknięciem” w tle, możesz użyć narzędzi takich jak zenity lub yad (jeśli lubisz guis). Nadal mogą wysyłać i odbierać dane wyjściowe z tła. Jestem pewien, że granie za pomocą rur i urządzeń zapewniłoby ci również dostęp do konsoli z tła, ale nie jestem pewien, jak to zrobić.
Joe,

@ Joe To spoko, ale wcale nie to, co mam na myśli. Chcę tylko wysłać aplikację bezpośrednio w tło, nie przerywając jej. tzn. bez naciskania, ctrl+za następnie uruchamiania polecenia bg. Czy istnieje jedna kombinacja klawiszy, aby wysłać aplikację w tło?
trusktr

Odpowiedzi:


17

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

Zbliżeniem jest bardzo szybkie przesłanie aplikacji do tła. W końcu aplikacja dzieli czas procesora z innymi, a przerwa wynosząca kilka setnych sekundy nie powinna mieć znaczenia. (Dzieje się tak w przypadku aplikacji działających w czasie rzeczywistym, więc należy uruchomić je w tle.) Używam powiązania powłoki dla Ctrl+, Zktóre wysyła zadanie pierwszoplanowe do tła. W ten sposób naciśnięcie Ctrl+ Z Ctrl+ Zwysyła zadanie do tła przy minimalnym czasie zawieszenia.

Oto moje wiązanie zsh, które również „w tle” wpisuje na wpół wpisane polecenie, gdy wiersz polecenia nie jest pusty .

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

W języku angielskim dla odbiorców niebędących użytkownikami Zsh:

  • Zdefiniuj funkcję powłoki, która wykonuje następujące czynności:

    • Jeśli długość bufora wejściowego wynosi 0, umieść bieżące zadanie (zadanie, które zostało ostatnio zawieszone lub uruchomione) w tle i ponownie wyświetl monit.
    • W przeciwnym razie wepchnij bufor wejściowy na stos i pokaż nowy monit. Gdy użytkownik wprowadzi polecenie lub anuluje je za pomocą Ctrl+ C, wypchnięty bufor jest przywracany do dalszej edycji.
  • Powiąż tę funkcję z Ctrl+ Z.

Jeśli chcesz tylko zachowanie w tle, niezależnie od tego, czy wiersz poleceń jest pusty:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

Nie wiem, czy możesz zrobić to samo w bash. Powinno to być tak proste, jak bind -x '"\C-z": bg'tylko, że bash pozostawia znak tty stop na miejscu, więc nigdy nie dostaje Ctrl+ Zjako danych wejściowych.


Interesujące, pozwól mi zobaczyć, czy można to zrobić w Bash. Jeśli tak, byłoby to rozwiązanie. Nie znam się na Zsh. Czy możesz wyjaśnić, co robi Twój skrypt?
trusktr,

@trusktr Zobacz moją edycję.
Gilles „SO- przestań być zły”

Dzięki! Zaraz przestawię się na Zsh. Słyszałem o tym wiele dobrych rzeczy.
trusktr

15

Możesz wykonać zadanie w tle, dodając &po nim.

Na przykład tail -f /var/log/messages &natychmiast wykona zadanie w tle.

Jak zawsze widać, jakie zadania wykonałeś w tle za pomocą jobspolecenia.

To oczywiście zakłada, że ​​jeszcze nie uruchomiłeś polecenia.


To przydatne, ale nie o to mi chodzi. Jeśli mam aplikację na pierwszym planie, a następnie chcę wysłać ją w tle później, mogę nacisnąć, ctrl+za następnie wykonać bgw wierszu polecenia, aby aplikacja działała w tle. Ale między naciśnięciem ctrl+za uruchomieniem bgistnieje przedział czasowy, w którym aplikacja jest całkowicie wstrzymana. Nie chce tego Jak wysłać go natychmiast do tła ?
trusktr

@trusktr, jak powiedział Gilles. Musisz poinformować zarówno powłokę, jak i terminal. Przepraszam, nie wiem jak to zrobić.
prateek61

To nie odpowiada na pytanie.
Luciano Andress Martini

4

Tło polecenia wykonuje się, dodając do polecenia znak „i”.

sleep 300 &

Jeśli jest już uruchomiony, jedyną opcją jest jego zatrzymanie, a następnie tło.


Pomiędzy naciśnięciem klawiszy Ctrl + Z a uruchomieniem bg istnieje pewien przedział czasowy, w którym aplikacja jest całkowicie wstrzymana, czego nie chcę. Więc nie ma sposobu, aby natychmiast wysłać go do tła ?
trusktr

1
Nie. Jak powiedział Giles, zabiera zarówno powłokę, jak i terminal. Musisz poinformować każdego.
bahamat
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.