GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich Strg-Z und bg in einem Tastendruck ausführen, damit der Prozess im Hintergrund fortgesetzt wird?

Die Strg +Z Die Sequenz wird vom Terminal verarbeitet, nicht von der Shell. (Nützlicher Hintergrund:Was ist der genaue Unterschied zwischen einem 'Terminal', einer 'Shell', einem 'tty' und einer 'Konsole'?)

Nur ein kleiner, nicht erweiterbarer Satz von Funktionen kann an eine Taste in einem Terminal gebunden werden. Sie können die mit diesen Funktionen verknüpften Tasten anpassen, aber keine weitere Funktion hinzufügen. Diese Funktionen fallen in drei Kategorien:

  • Kommandozeilen-Edition in Programmen, die keinen eigenen bereitstellen (kanonischer Modus, auch Cooked-Modus genannt (im Gegensatz zum Raw-Modus), den Sie in der Praxis selten verwenden werden):Dateiende (eof , Strg +D ), Zeilenende (eol , Strg +M ), Zeichen links löschen (erase , Strg +H ), linkes Wort löschen (werase , Strg +W ), Zeile löschen (kill , Strg +U ).
  • Manuelle Flusskontrolle:stop (Strg +S ), start (Strg +Q ). Nur nützlich bei alten seriellen Terminals, die Zeichen verloren haben, wenn das Terminal nicht mit dem Computer mithalten konnte oder umgekehrt.
  • Signalisierung:Interrupt (intr , Strg +C ), Beenden erzwingen (quit , Strg +\ ), anhalten (Strg +Z ).

Einige Systeme, einschließlich Linux, erweitern diese Liste, aber ich habe noch nie eines gesehen, das Hintergrundinformationen enthielt. Beachten Sie, dass dies sowohl im Terminaltreiber im Kernel als auch im Terminalemulator unterstützt werden würde. Sie müssen sich also mit Suspend begnügen, das dem Vordergrundjob ein SIGTSTP-Signal sendet. Dies löst ein SIGCHLD im übergeordneten Prozess des Leaders des Vordergrundjobs aus, der normalerweise die Shell ist. Wenn die Shell SIGCHLD empfängt, ruft sie waitpid auf um herauszufinden, warum es benachrichtigt wurde, und wenn erkannt wird, dass ein Hintergrundjob ausgesetzt wurde, zeigt es eine Benachrichtigung an (z. B. [1] + 12345 suspended mycommand ) und eine neue Eingabeaufforderung.

Sie könnten die Shell so programmieren, dass sie einen SIGCONT sendet Signal an den Vordergrundjob. Ich glaube nicht, dass zsh dafür einen Haken hat, Sie müssten den Quellcode patchen. Und es gibt für zsh keine Möglichkeit zu wissen, ob Sie das Programm wirklich unterbrechen wollten (oops, dieses Programm macht möglicherweise das Falsche, lassen Sie es mich anhalten, während ich es regele) oder es in den Hintergrund versetzen.

Was ich tue, ist, die Ctrl einzustellen +Z Tastenfolge in zsh, um den aktuellen Job in den Hintergrund zu schalten (%% ). Auf diese Weise kann ich den Vordergrundjob in den Hintergrund schicken, indem ich Strg drücke +Z Strg +Z . Wo ich gerade dabei bin, mache ich Ctrl +Z etwas anderes Nützliches tun, wenn die aktuelle Eingabezeile nicht leer ist (ich bin also nicht gerade von einem Unterprozess zurückgekommen):die aktuelle Eingabezeile „anhalten“, damit ich einen weiteren Befehl eingeben kann, wonach die unterbrochene Zeile wieder eingefügt wird den Eingabepuffer.

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

^z ^z wie zsh oben ist in Bash möglich, obwohl es ein bisschen klobig ist und ich es nicht lange ausgeführt habe:

  • Fügen Sie in Ihrer .inputrc die Zuordnung "\C-z": "bg\n" ein
  • Fügen Sie in die PS0-Bash-Variable `$(stty susp ^z)' ein
  • In die Bash-Variable PROMPT_COMMAND fügen Sie 'stty susp ^@' ein

^z für Suspend wird also eingeschaltet, wenn ein Befehl ausgeführt wird, und dann für die Bash-Eingabeaufforderung ausgeschaltet.


Linux
  1. So starten Sie den Linux-Befehl im Hintergrund und trennen den Prozess im Terminal

  2. Wie unterbreche ich einen Hintergrundprozess und bringe ihn in den Vordergrund?

  3. So führen Sie den Rsync-Prozess im Hintergrund aus

  4. Wie kann ein Prozess stdout und stderr eines anderen Prozesses unter Linux abfangen?

  5. Wie bekomme ich die Prozess-ID des Hintergrundprozesses?

[Bash-Tipps] How To cd und ls in einem Befehl

[Bash-Tipps] Wie cp oder mv und cd in einem Befehl ausgeführt werden

So arbeiten Sie mit Vordergrund- und Hintergrundprozessen unter Linux

Wie kann ich ein Passwort löschen und das Konto in einem Schritt sperren?

Kann ich einen Benutzer (und seine Apps) auf eine Netzwerkschnittstelle beschränken?

Wie kann man alle Threads (und untergeordneten Elemente) eines Prozesses unter Linux neu erstellen?