私はフォアグラウンドプロセスアプローチがあまりにも多くの努力を必要とすることを否定します。
zsh
前景にプロセスがあるとしましょう。 .disown
SIGHUP
現在はCtrl+で始まるバックグラウンドに移動してzプロセスを一時停止し、
$ disown
disown: warning: job is suspended, use `kill -CONT -32240' to resume
$ kill -CONT -32240
$
—それから端末を閉じることができます。
これをどのように自動化できますか?理想的には、Ctrl+jまたは他のキーを押して実行中のプロセスをすぐに拒否できることを願っています。あるいは、2番目に、SIGCONT
プロセスを拒否して一時停止するコマンドを実行できたらと思います。
ベストアンサー1
ターミナルでCtrl+を押すと、ZフォアグラウンドプロセスグループはSIGTSTP信号を受信します(ターミナルがベークモードにあり、主キーバインディングがあると仮定)。プロセスがSIGTSTP用のシグナルハンドラを設定しないと、プロセスは中断されます(プロセスがシグナルハンドラを設定しても通常は中断される前に少量の処理しか実行されません)。プロセスが終了、一時停止、または再開されると、対応する親プロセスはSIGCHLD信号を介して通知されます。これにより、シェルに新しいプロンプトと同様のメッセージが表示されます[1] + 1234 suspended foo
。情報フローは
key→shell→suspension
ではなく
key→suspension→shellなので、+に対して他の応答を設定すること
はできません。CtrlZ
SIGCHLDのトラップを設定できますが、ジョブが現在フォアグラウンドジョブの場合、トラップは実行されません。ほとんどの場合、これはフォアグラウンドジョブが終了したときではなく、バックグラウンドジョブが終了したときにのみトラップが実行されることを意味します。しかし、これはフォアグラウンドジョブの一時停止に対応できないという意味でもあります。
precmd
precmd
ジョブの状態を最後の実行で保存された状態と比較するフックを設定することで、バックグラウンドジョブの変更に間接的に反応することができます。しかし、これで何ができるかはわかりません。一時停止キーのみが存在する可能性があるため、プロセスを一時停止するのか、バックグラウンドにするのか、拒否するのかを知るためには、追加情報が必要です。
空のプロンプトでCtrl+を押すと、Z現在のジョブがバックグラウンドで実行されるようにzshを設定しました。これにより、Ctrl+をZ2回押すと、しばらくの間停止し、前景操作を背景に切り替えることができます。
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
disown
必要に応じて電話してください。または、Ctrl次のテストされていない修正で3番目の+が呼び出されるように準備することもできますZ。disown
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
if (($fancy_ctrl_z_already_bg)); then
disown
else
bg
fancy_ctrl_z_already_bg=1
fi
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
fancy_ctrl_z_precmd () {
fancy_ctrl_z_already_bg=0
}
precmd_functions+=fancy_ctrl_z_precmd