web-dev-qa-db-ja.com

待たせずにコマンドを実行する

CLIでは、入力したコマンドが完了するまでに時間がかかる場合があります。また、それがいつ発生するかを知っている場合もあります。 Linuxの「バックグラウンド」などについて少し混乱しています。

待機したくないことをCLIに伝える最も一般的な(またはユーザーフレンドリーな方法)は何ですか。プロンプトをすぐに返してください。そして、それが私にプログレスバーまたはビジースピナーを与えることができれば、それは素晴らしいことです!

147
themirror

コマンドを実行する前に、&をコマンドラインに追加して、バックグラウンドで実行できます。

long-running-command &

コマンドを開始した後、 CtrlZ 一時停止し、次にbgをバックグラウンドに配置します。

long-running-command
[Ctrl+Z]
bg
158
Greg Hewgill

プロセスをバックグラウンドに送ることとは別に、テキスト出力が端末を汚すことを心配する必要がないので、これはすべてのお気に入りです。

Nohup command &

これはプロセスをバックグラウンドで実行するだけでなく、ログ(現在のディレクトリにNohup.outと呼ばれます。それが不可能な場合はホームディレクトリ)を生成し、現在のシェルを閉じる/ログアウトした場合、プロセスは防止によって強制終了されません。子プロセスは、殺されたときに親シグナルを受け取ることからシグナルを出します(つまり、ログアウト、親へのSIGHUP、または現在のシェルを閉じます)。

他にもdisownと呼ばれるものがありますが、それはメソッド自体ではなく、他の回答の拡張です。

command & # our program is in background
disown # now it detached itself of the Shell, you can do whatever you want

これらのコマンドでは、 ハックな方法でそれを実行しない限り、プロセスの出力を簡単に回復できません。

118
Braiam

これはおそらくあなたが望むものです

my_command > output.log 2>&1 &

これによりコマンドが開始され、stdoutとstderrの両方が指定可能なoutput.logにリダイレクトされます。出力をまったく保存しない場合は、実際のファイルの代わりに/dev/nullを使用できます。

&は、バックグラウンドでコマンドを実行するため、実行中にコマンドを入力し続けることができます。 2>&1はstderrをstdoutにリダイレクトし、すべての出力がキャッチされるようにします。

また、このようなコマンドを実行すると、次のようなカーネルから確認を取得する必要があります。[2] 1234これは、プロセスがバックグラウンドで実行されており、そのIDが1234であるため、kill -9 1234で必要に応じて後で終了できることを意味します

35
travnik

screen または tmux を調べます。 tmuxの例:

$ tmux new -d 'longrunningcommand'

バックグラウンドに「&」を使用する他の回答は機能しますが、stdout(およびstderr!)をリダイレクトする必要があります。そうしないと、出力は直接シェルに送られ、他の出力と混ざります。

長いコマンドを実行しているときにログアウトしたり、接続を切断したりした場合も、バックグラウンド化は失敗します。システムはあなたの仕事を殺します。

Screenやtmuxに慣れていない場合は、基本的にシェルから完全に切り離すことができます。プログラムをバックグラウンド化する代わりに、シェル全体をバックグラウンド化します。その後、別のコンピュータからでも、後で元の状態に戻すことができます。どちらも、このユースケースを超えて役立つかどうかにかかわらず、さらに多くの機能を備えています。

画面は昔から試された真のプログラムです。 tmuxはずっと新しいですが、screenの過去から学んでいます。

10
yoonix

(完全を期すため、既に回答済み:)コマンドの後に&を追加して、コマンドをバックグラウンドに配置します。

long_command with arguments > redirection &

あなたの質問の他の部分に対処するために、この回答を追加します:

進行中のバックグラウンドコマンドを表示するスピナーに相当するものはありませんが、jobsまたはjobs -lと入力すると、バックグラウンドコマンドのステータスを確認できます。バックグラウンドのコマンドが表示され、実行中か、シグナルを介して停止したか(例:^Z)、またはユーザーからのインタラクティブな入力を待機しているために停止したかどうかが表示されます。

5
alexis

&を使用して、プログラムをバックグラウンドで実行できます。たとえば、yum install XyZを実行する場合は、次のように実行できます。

yum install XyZ &

プログラムからのstdoutまたは出力は、>を使用してファイルを上書きするか、>>を使用してファイルに追加してリダイレクトできます。たとえば、yumをファイルyum.logに記録する場合:

yum install XyZ > yum.log &

または、既存のファイルlogに出力を追加する場合:

yum install XyZ >> log &

エラーはstderrではなくstdoutに出力され、同じ方法でファイルにリダイレクトできますが、2>を使用します。

yum install XyZ 2> errors
yum install XyZ 2>> errors

stderrstdoutの両方をリダイレクトする場合は、&>を使用できます。

yum install XyZ &> output
yum install XyZ &>> output
4
Davidson Chua

コマンドの後に&記号を付けるだけで、バックグラウンドでコマンドを実行できます。

例えば:

areallylong_command &

バックグラウンドで実行します。

Stdout/stderrを適切なファイルにさらにリダイレクトして、何かをしている間、それらが端末に表示されないようにすることができます。

詳細はこちらをご覧ください: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

2
mkc

実行時間の長いタスクを開始する前に「screen」コマンドを使用してみてください。切り離すと、「screen -r -d」を使用して再度接続することができます。 sshやその他のネットワーク接続を介して端末を使用する場合、サーバーへの接続が悪いために端末が壊れることがあります。 「画面」内で実行すると、この問題が修正されます。

0
meaje