web-dev-qa-db-ja.com

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

ctrl+zはアプリを停止し、bgコマンドを使用してアプリをバックグラウンドに送信できますが、これはアプリが停止するまでに少し時間がかかることを意味します。

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

22
trusktr

アプリケーションをフォアグラウンドからバックグラウンドに送信するには、ターミナルとシェルの両方からの協力が必要です。シェルはフォアグラウンドプロセスグループを設定する必要があるため、ターミナルはそれを単独で行うことはできません。ターミナルはキープレスを処理する必要があるため、シェルは単独でそれを行うことはできません(シェルはフォアグラウンドにないため、キープレスを受信できません)。

近似は、アプリケーションをバックグラウンドに非常に高速に送信することです。結局のところ、アプリケーションは他の人とCPU時間を共有し、数百分の1秒の一時停止は問題になりません。 (これは、リアルタイムアプリケーション用です。必ずバックグラウンドで開始してください。)シェルバインディングを使用して Ctrl+Z 最後にフォアグラウンド化されたジョブをバックグラウンドに送信します。そのように、押す Ctrl+ZCtrl+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の場合、現在の ジョブ (最後に中断または開始されたジョブ)を バックグラウンド に入れます。および redisplay プロンプト。
    • それ以外の場合、 入力バッファーをプッシュ をスタックに入れて、新しいプロンプトを表示します。ユーザーがコマンドを入力またはキャンセルすると Ctrl+C、プッシュされたバッファは、さらに編集できるように戻されます。
  • この関数をバインドします Ctrl+Z

コマンドラインが空であるかどうかに関係なく、バックグラウンド動作のみが必要な場合:

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

Bashで同じことができるかどうかはわかりません。 bind -x '"\C-z": bg'と同じくらい簡単でなければなりませんが、bashはttyストップ文字をそのままにしておくため、 Ctrl+Z 入力として。

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

たとえば、tail -f /var/log/messages &はタスクをすぐにバックグラウンドで実行します。

いつものように、jobsコマンドでバックグラウンドにしたタスクを確認できます。

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

16
prateek61

コマンドの背景には、コマンドにアンパサンドを追加します。

sleep 300 &

すでに実行されている場合は、それを停止してからバックグラウンドで実行するしかありません。

4
bahamat