コマンドラインアプリケーションをバックグラウンドで直接送信するにはどうすればよいですか?

コマンドラインアプリケーションをバックグラウンドで直接送信するにはどうすればよいですか?

ctrl+zタップするとアプリが停止することが既にわかっており、そのbgコマンドを使用してアプリをバックグラウンドで送信できますが、これはアプリがしばらく停止することを意味します。

アプリを停止せずにバックグラウンドに直接移動するにはどうすればよいですか?

答え1

フォアグラウンドからバックグラウンドにアプリケーションを送信するには、端末とシェルの協力が必要です。端末は、シェルがフォアグラウンドプロセスグループを設定する必要があるため、単独では実行できません。端末がキー押下を処理する必要があるため、シェルはこの操作を単独で実行できません(シェルは前景にないため、キー押下を受信できません)。

最も近い方法の1つは、アプリをバックグラウンドですばやく送信することです。結局のところ、アプリケーションは他のアプリケーションとCPU時間を共有するため、数百分の1秒の一時停止は重要ではありません。 (ライブアプリケーションで動作するため、バックグラウンドで起動したことを確認してください。)Ctrl+シェルバインディングを使用して、Z最後のフォアグラウンドタスクをバックグラウンドに送信します。これにより、Ctrl+を押すと一時停止時間を最小限に抑えながらZ CtrlタスクZをバックグラウンドに送信します。

ここに私のzshバインディングがあります。コマンドラインが空でない場合の「背景」インポートコマンド

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

視聴中にzsh以外のユーザーの場合は、英語で:

  • 以下を実行するシェル関数を定義します。

    • 長さ入力バッファ0なら現在働く(最後のジョブが一時停止または開始された場合)背景再表示ヒント。
    • そうでなければ、入力バッファにプッシュスタックに追加し、新しいプロンプトを表示します。ユーザーがコマンドを入力するか、Ctrl+ を使用してコマンドをキャンセルすると、追加の編集用にプッシュされたCバッファーが再インポートされます。
  • この関数をCtrl+にバインドしますZ

コマンドラインが空であるかどうかにかかわらず、バックグラウンドアクションのみを希望する場合:

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

Bashでも同じことができるかどうかわかりません。bind -x '"\C-z": bg'bashはttyストップ文字を所定の位置に保持するため、入力としてCtrl+を使用しないかのように単純でなければなりませんZ

答え2

&タスクの後にタスクを追加することで、バックグラウンドにタスクを配置できます。

たとえば、tail -f /var/log/messages &ジョブはすぐにバックグラウンドに配置されます。

いつものように、このコマンドを使用すると、バックグラウンドで実行されている操作を表示できますjobs

もちろん、これはまだコマンドを実行していないと仮定します。

答え3

コマンドのバックグラウンド処理は、コマンドの末尾に & 記号を追加することによって実行されます。

sleep 300 &

すでに実行している場合、唯一のオプションは停止してバックグラウンドに置くことです。

関連情報