Meine Methode zum Ablehnen des Vordergrundprozesses erfordert zu viel Aufwand.
Angenommen, ich habe einen Prozess im zsh
Vordergrund. Ich möchte disown
es, damit ich die Shell schließen kann, ohne dass der Prozess gesendet wird SIGHUP
.
Im Moment beginne ich mit Ctrl+ zzum Hintergrund und unterbreche dann den Vorgang
$ disown
disown: warning: job is suspended, use `kill -CONT -32240' to resume
$ kill -CONT -32240
$
- Dann kann ich das Terminal schließen.
Wie kann ich das automatisieren? Im Idealfall möchte ich in der Lage sein, Ctrl+ joder etwas zu drücken , um den laufenden Prozess sofort abzulehnen. Oder zweitbester, ich möchte in der Lage sein, einen einzelnen Befehl auszuführen, um sowohl SIGCONT
den Prozess als auch den Prozess abzulehnen , sobald er angehalten ist.
bg
+disown
stattkill -CONT -1234
.alias dr='disown -r'
in Bash verwendet.bg
unddr
mach den Trick.Antworten:
Eine globale Tastenkombination zum Deaktivieren des Vordergrundprozesses ist nicht möglich: Tastenanschläge werden vom Vordergrundprozess und nicht von der Shell empfangen. Sie müssen es zuerst mit Ctrl+ aussetzen, zwenn Sie es ablehnen möchten.
Es stellt sich jedoch heraus, dass es eine zsh-Option gibt, um das Ablehnen zu beschleunigen und dann fortzufahren : Mit
setopt AUTO_CONTINUE
,disown
wird automatisch auch gesendetSIGCONT
.Sie können es also auf den Punkt bringen
C-z
disown
.quelle
Wenn Sie in einem Terminal Ctrl+ drücken Z, empfängt die Prozessgruppe im Vordergrund das Signal SIGTSTP (vorausgesetzt, das Terminal befindet sich im gekochten Modus und die Standardtastenbindungen sind vorhanden). Wenn der Prozess keinen Signalhandler für SIGTSTP festgelegt hat, wird der Prozess angehalten (und selbst wenn der Prozess einen Signalhandler festgelegt hat, führt er normalerweise nur eine geringe Menge an Verarbeitung durch, bevor er sich selbst anhält). Wenn ein Prozess beendet, angehalten oder fortgesetzt wird, wird sein übergeordnetes Element über ein SIGCHLD-Signal benachrichtigt. Aus diesem Grund zeigt die Shell eine neue Eingabeaufforderung und möglicherweise eine Meldung wie an
[1] + 1234 suspended foo
. Der Informationsfluss istSchlüssel → Suspension → Shell
und nicht
Schlüssel → Shell → Suspension,
sodass Sie für Ctrl+ keine andere Reaktion konfigurieren können Z.
Sie können einen Trap für SIGCHLD festlegen, der Trap wird jedoch nicht ausgeführt, wenn der Job der aktuelle Vordergrundjob ist. Zum größten Teil bedeutet dies, dass der Trap nur ausgeführt wird, wenn ein Hintergrundjob beendet wird, nicht wenn der Vordergrundjob beendet wird. Es bedeutet aber auch, dass Sie nicht auf die Unterbrechung des Vordergrundjobs reagieren können.
Sie können indirekt auf Änderungen in Hintergrundjobs reagieren, indem Sie einen
precmd
Hook festlegen, der die Jobzustände mit den aus dem vorherigenprecmd
Lauf gespeicherten Zuständen vergleicht . Aber ich weiß nicht, was Sie damit machen können: Es kann nur einen einzigen Suspend-Schlüssel geben, daher benötigen Sie einige zusätzliche Informationen, um zu wissen, ob der Prozess angehalten, im Hintergrund oder abgelehnt werden sollte.Ich habe zsh so eingerichtet, dass das Drücken von Ctrl+ Zan einer leeren Eingabeaufforderung den aktuellen Job hinterlegt. Dadurch kann ich zweimal Ctrl+ drücken Z, um den Vordergrundjob mit nur einer kurzen Unterbrechung in den Hintergrund zu stellen.
Sie können es anrufen,
disown
wenn Sie möchten. Oder Sie können einen dritten Ctrl+ ZAnrufdisown
mit der folgenden ungetesteten Änderung veranlassen.quelle
isig
ist genug (auch ohneicanon
)SIGTSTP
wird das vom Terminalemulator gesendet? Ist es möglich, den Emulator (den Sie kennen) so zu konfigurieren, dass er seine Funktionsweise für einen ändert^Z
? Wie in der Verknüpfungspräferenz?stty +isig
) aktiviert ist . Sie können mit dem Befehl stty ändern, welches Zeichen dies auslöst (Sie können keinen beliebigen Schlüssel festlegen, es muss ein einzelnes Byte sein, keine Escape-Sequenz). Während sich die Shell im Vordergrund befindet, werden die Terminaleinstellungen geändert, um das Drücken von Tasten zu übernehmen, sodass die Wirkung von Strg + Z von den Tastenbelegungen der Shell abhängt.