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


22

を押すctrl+zとアプリが停止することを既に知っています。bgコマンドを使用してアプリをバックグラウンドに送信できますが、それはアプリが停止する時間の短い期間があることを意味します。

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


既に実行されている場合は、実行できないことを確認してください。
ケビン

1
タスクがバックグラウンドに「消える前に」入力を必要とする場合、zenityやyad(guiが好きな場合)などのツールを使用できます。彼らはまだバックグラウンドから出力を送受信できます。パイプやデバイスで遊んでも、バックグラウンドからコンソールにアクセスできると確信していますが、その方法はわかりません。
ジョー

@ジョーそれはクールですが、私が言っていることはまったくありません。アプリを一時停止せずにバックグラウンドに直接送信したいだけです。すなわちを押さずにctrl+zコマンドを実行しbgます。アプリをバックグラウンドに送信するための単一のキーストロークコンボはありますか?
trusktr

回答:


17

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

近似は、アプリケーションを非常に高速でバックグラウンドに送信することです。結局、アプリケーションは他のユーザーと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ユーザーの場合:

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

  • この関数をCtrl+にバインドしますZ

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

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

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


興味深いことに、これをBashで実行できるかどうかを見てみましょう。もしそうなら、これは解決策になります。私はzshに慣れていません。あなたのスクリプトが何をするのかを説明しますか?
trusktr

@trusktr編集をご覧ください。
ジル「SO-悪であるのをやめる」

ありがとう!zshに切り替えようとしています。私はそれについてとても良いことを聞いてきました。
trusktr

15

タスクをバックグラウンドに追加する&には、タスクを追加します。

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

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

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


それは便利ですが、私が言っていることではありません。アプリをフォアグラウンドで使用していて、後でバックグラウンドに送信したいctrl+z場合bgは、コマンドラインでを押して実行し、アプリをバックグラウンドで実行します。ただし、を押してctrl+zから実行するまでの間にbg、アプリが完全に一時停止する期間があります。私はそれを望んでいません。すぐにバックグラウンドに送信するにはどうすればよいですか?
trusktr

ジルが言ったような@trusktr。シェルと端末の両方に通知する必要があります。申し訳ありませんが、私はそれを行う方法を知りません。
prateek61

質問には答えません。
ルチアーノアンドレスマティーニ

4

コマンドのバックグラウンド化は、コマンドにアンパサンドを追加することにより行われます。

sleep 300 &

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


ctrl + zを押してからbgを実行するまでの間に、アプリが完全に一時停止する期間がありますが、これは望ましくありません。したがって、すぐにバックグラウンドに送信する方法はありませんか?
trusktr

1
いや。ジャイルズが言ったように、シェルとターミナルの両方が必要です。それぞれに通知する必要があります。
バハマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.