Wie schicke ich Kommandozeilen-Apps direkt in den Hintergrund?

22

Ich weiß bereits, dass das Drücken von ctrl+zdie App stoppt und ich die App dann mit dem bgBefehl in den Hintergrund senden kann , aber das bedeutet, dass es eine kurze Zeitspanne gibt, in der die App gestoppt wird.

Wie sende ich die App direkt in den Hintergrund, ohne sie anzuhalten?

trusktr
quelle
Ich bin mir ziemlich sicher, dass du das nicht kannst, wenn es bereits läuft.
Kevin
1
Wenn Ihre Aufgabe Ihre Eingabe erfordert, bevor Sie im Hintergrund verschwinden, können Sie Tools wie zenity oder yad verwenden (wenn Sie guis mögen). Sie können weiterhin Ausgaben aus dem Hintergrund senden und empfangen. Ich bin mir sicher, dass Sie durch das Spielen mit Pipes und Geräten auch vom Hintergrund aus auf die Konsole zugreifen können, aber ich bin mir nicht sicher, wie Sie das tun sollen.
Joe
@ Joe Das ist cool, aber überhaupt nicht das, was ich meine. Ich möchte nur eine App direkt in den Hintergrund senden, ohne sie anzuhalten. dh ohne Drücken von ctrl+zgefolgt von Ausführen des Befehls bg. Gibt es eine Tastenkombination, mit der die App in den Hintergrund verschoben werden kann?
Trusktr

Antworten:

17

Das Senden einer Anwendung vom Vordergrund in den Hintergrund erfordert die Zusammenarbeit von Terminal und Shell. Das Terminal kann dies nicht alleine tun, da die Shell die Vordergrundprozessgruppe festlegen muss. Die Shell kann dies nicht alleine tun, da das Terminal den Tastendruck verarbeiten muss (die Shell ist nicht im Vordergrund, daher kann sie keinen Tastendruck empfangen).

Eine gute Annäherung ist, die Anwendung sehr schnell in den Hintergrund zu schicken. Immerhin teilt eine Anwendung die CPU-Zeit mit anderen und eine Pause von einigen Hundertstelsekunden sollte keine Rolle spielen. (Dies gilt für Echtzeitanwendungen. Stellen Sie daher sicher, dass Sie diese im Hintergrund starten.) Ich verwende eine Shell-Bindung für Ctrl+ Z, die den zuletzt vordergründigen Job an den Hintergrund sendet. Auf diese Weise wird durch Drücken von Ctrl+ Z Ctrl+ Zein Auftrag mit minimaler Unterbrechungszeit in den Hintergrund verschoben.

Hier ist meine zsh-Bindung, die auch einen halb getippten Befehl „im Hintergrund“ darstellt, wenn die Befehlszeile nicht leer ist .

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

Auf Englisch für die Nicht-zsh-Benutzer im Publikum:

  • Definieren Sie eine Shell-Funktion, die Folgendes ausführt:

    • Wenn die Länge des Puffereingangs 0 ist , dann setzen den aktuellen Job (Job, der den letzten aufgehängt oder gestartet wurde) im Hintergrund , und erneut anzuzeigen die Aufforderung.
    • Andernfalls legen Sie den Eingabepuffer auf einen Stapel und zeigen eine neue Eingabeaufforderung an. Sobald der Benutzer einen Befehl eingibt oder ihn mit Ctrl+ abbricht C, wird der gepushte Puffer zur weiteren Bearbeitung zurückgebracht.
  • Binden Sie diese Funktion an Ctrl+ Z.

Wenn Sie nur das Hintergrundverhalten wünschen, unabhängig davon, ob die Befehlszeile leer ist:

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

Ich weiß nicht, ob Sie dasselbe in Bash tun können. Es sollte so einfach wie möglich sein bind -x '"\C-z": bg', mit der Ausnahme, dass die Bash das Tty-Stop-Zeichen an der richtigen Stelle belässt, sodass es niemals Ctrl+ Zals Eingabe erhält .

Gilles 'SO - hör auf böse zu sein'
quelle
Interessant, lassen Sie mich sehen, ob dies in Bash gemacht werden kann. Wenn ja, wäre dies eine Lösung. Ich kenne mich mit zsh nicht aus. Hast du etwas dagegen zu erklären, was dein Skript macht?
Trusktr
@trusktr Siehe meine Bearbeitung.
Gilles 'SO- hör auf böse zu sein'
Vielen Dank! Ich werde gleich zu zsh wechseln. Ich habe so viel Gutes darüber gehört.
Trusktr
15

Sie können eine Aufgabe im Hintergrund ausführen, indem Sie eine nachträgliche hinzufügen &.

Zum Beispiel tail -f /var/log/messages &wird die Aufgabe sofort im Hintergrund.

Wie immer können Sie sehen, welche Aufgaben Sie mit dem jobsBefehl im Hintergrund ausgeführt haben.

Dies setzt natürlich voraus, dass Sie den Befehl noch nicht ausgeführt haben.

prateek61
quelle
Das ist nützlich, aber nicht das, was ich meine. Wenn ich die App im Vordergrund habe, dann möchte ich sie später in den Hintergrund senden, kann ctrl+zdann bgüber die Kommandozeile ausführen , dass die App im Hintergrund läuft. Zwischen dem Drücken ctrl+zund Ausführen bggibt es jedoch einen Zeitraum, in dem die App vollständig angehalten ist. Ich will das nicht. Wie sende ich es sofort in den Hintergrund ?
Trusktr
@trusktr wie Gilles sagte. Sie müssen sowohl die Shell als auch das Terminal informieren. Entschuldigung, ich kenne keinen Weg, das zu tun.
Prateek61
Es beantwortet die Frage nicht.
Luciano Andress Martini
4

Zum Hintergrund eines Befehls wird ein kaufmännisches Und an den Befehl angehängt.

sleep 300 &

Wenn es bereits ausgeführt wird, können Sie es nur stoppen und dann im Hintergrund ausführen.

Bahamat
quelle
Zwischen dem Drücken von Strg + Z und dem Ausführen von BG gibt es einen Zeitraum, in dem die App vollständig angehalten ist, was ich nicht möchte. So gibt es keine Möglichkeit, es sofort in den Hintergrund zu senden ?
Trusktr
1
Nee. Wie Giles sagte, braucht es sowohl die Shell als auch das Terminal. Sie müssen jeden informieren.
Bahamat