zshでフォアグラウンドプロセスをすばやく拒否するにはどうすればよいですか?

zshでフォアグラウンドプロセスをすばやく拒否するにはどうすればよいですか?

私はフォアグラウンドプロセスアプローチがあまりにも多くの努力を必要とすることを否定します。

zsh前景にプロセスがあるとしましょう。 .disownSIGHUP

現在は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のトラップを設定できますが、ジョブが現在フォアグラウンドジョブの場合、トラップは実行されません。ほとんどの場合、これはフォアグラウンドジョブが終了したときではなく、バックグラウンドジョブが終了したときにのみトラップが実行されることを意味します。しかし、これはフォアグラウンドジョブの一時停止に対応できないという意味でもあります。

precmdprecmdジョブの状態を最後の実行で保存された状態と比較するフックを設定することで、バックグラウンドジョブの変更に間接的に反応することができます。しかし、これで何ができるかはわかりません。一時停止キーのみが存在する可能性があるため、プロセスを一時停止するのか、バックグラウンドにするのか、拒否するのかを知るためには、追加情報が必要です。

空のプロンプトで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番目の+が呼び出されるように準備することもできますZdisown

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

おすすめ記事