凍結せずにジョブをバックグラウンドに配置


9

あなたはこのように仕事を始めるとしましょう

foo

そして、それをバックグラウンドに置きたいと望みます。Ctrl+ Zと入力するとbgトリックが行われますがfooCtrl+ Zとの間でフリーズしbgます。最初にフリーズせずにfooをバックグラウンドに配置するにはどうすればよいですか?


7
ユースケースは何ですか?プロセスが短時間フリーズするのはなぜ問題なのですか?
l0b0 14

回答:


4

技術的にはfooすでにバックグラウンドで実行されています。2番目のターミナルセッションを開始できます。最初のセッションは、foo他のことを行っている間も実行を続けます。

Xでは、2番目のターミナルアプリケーションを起動するか、選択したターミナルエミュレータにそのような機能がある場合は別のタブを開くだけです。

コンソールで計画を立てていなかった場合は、別の仮想端末に切り替えて、再度ログインする必要があります。

あなたのようなターミナルマルチプレクサを使用している場合screenか、tmuxあなたはその中に別のセッションを開始することができます。例えば、画面に、これを使用して行われCtrl+ A直ちに続いCtrl+ C。それらを切り替えるには、Ca CnとCa Cpを使用して端末セッション間を行き来します。


つまり、bashでは不可能です。
user877329 2014

1
この答えは、バックグラウンドジョブの概念の誤解に基づいているようです。端末には「フォアグラウンドプロセスグループ」属性があり、通常はシェルによって設定されます。これにより、そのグループ内のプロセスが端末から読み取り、SIGINTのようなtty関連の信号を受信できるようになります。フォアグラウンドプロセスグループに含まれていない、ターミナルで実行されているすべてのプロセスは、バックグラウンドプロセスです。新しいターミナルを作成すると、たとえそれを表示していなくても、元のターミナルのフォアグラウンドジョブはそのターミナルのフォアグラウンドジョブのままです。

@ WumpusQ.Wumbley私の回答の要点は、bashを実行できるほとんど(すべて?)のシステムは、その性質上マルチタスクであるということです。そのようなシステムでは、たとえプロセスに入力フォーカスがあるとしても、プロセス自体 について本質的に「前景」はありませんfoo それ自体(特定の検査がない場合、私が実際に目にするのはまれであり、存在しないと思われる)は、最上位のウィンドウで実行されているかどうか、またはその出力を表示しているものがあるかどうかに関係ありません。
CVn 2014

1
私のポイントは、質問が「バックグラウンド」と「ジョブ」という単語に言及している場合、どちらもPOSIXプロセスグループフレームワークで定義された意味を持つ技術用語であると同時に、Ctrl-Zとbgのメカニズムにも言及しています。プロセスグループを操作する-あなたの答えはプロセスグループの機能をまったく使用しないことを示唆しており、実際の定義と一致しない方法で「バックグラウンド」という単語を使用している-あなたは質問に答えを当てはめていません。そして、「技術的にはfoo既にバックグラウンドで実行されています」から始めましょう...ただ...いいえ、技術的には。

@ WumpusQ.Wumbleyどういうわけか私はOPがPOSIX標準を読んだとは思わず、「うーん、これを使いたいのですが、すでに始めたfooので、どうしたらいいですか?」と思いました。質問に答える際に有用ではありませんあなたはこの答え(または他の回答)を感じた場合、私は、議決権を行使することをお勧めしますだけでなく、あなたが正しい角度で何を感じるからの質問に答えるあなた自身の答えを残してではなく、質問に残った答えの1つについて議論します。たとえば、l0b0の答えの方が良いと感じるかもしれませんが、私の答えは、OPが望むことを少なくともおおよそ行う方法を提供します。
CVn 2014

3

&コマンド(foo &)の後に記号を追加すると、すぐに背景が表示されます。しかし、標準のターミナル/シェル構成では、フォアグラウンドになったらすぐに何かをバックグラウンド化する方法はないと私は信じています。


3

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

私が持っているzshの設定私が押すことができますCtrl+ Z立て続けに二回を。最初のプレスはプロセスを一時停止し、2番目のプレスはバックグラウンドで再開します。bashに移植する方法がわかりません。

キーストロークを注入できるターミナルエミュレーターで実行している場合は、^Zbg^M^制御文字の表記を使用して)注入できます。たとえば、X11ターミナルエミュレータを使用して実行します。1234はターミナルエミュレータxdotool --window 1234 Ctrl_L+Z b g ReturnのウィンドウIDです。Screenを使用して、screen -S foo -p 12 -X stuff $'\032bg\r'where fooはscreenセッションの名前で、12はウィンドウIDです。


2

入力がケースに対して十分に速くない場合はkill -s SIGSTOP 1023 && kill -s SIGCONT 1023、1023をターゲットPIDとして、別のシェルから実行します。

免責事項:Ruslanがおそらく知っていたように、そのシーケンスは実際にジョブを再開するので、すぐにbashは気付きません。


それはどのようにして仕事を背景に置くでしょうか?
Ruslan 2014

どのくらい速いですか?
user877329 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.