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


145

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

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


3
コマンドラインアプリをバックグラウンドに直接送信する方法も参照してくださいすでにコマンドを開始していて、それをバックグラウンドに送信したい場合。
ジル

回答:


153

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

long-running-command &

コマンドを開始した後、を押しCtrlZてコマンドを中断bgし、バックグラウンドに置くことができます。

long-running-command
[Ctrl+Z]
bg

「find〜/ a.java&」コマンドを使用しましたが、バックグラウンドで実行しませんでしたか?また、私はそれが働いていない....(Mac用)CMD + Zを試してみました
Abhimanyuアーリア人の

1
@AbhimanyuAryan、find ...最初にコマンドをデバッグしてからバックグラウンドで実行したい場合があります。この場合、-nameオプションがありませんでした。
アレクシスウィルケ

113

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

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

これらのコマンドでは、ハック的な方法を使用しない限り、プロセス出力を簡単に回復することはできません


4
95年以降のシステム管理者。今日まで、嫌悪感を聞いたことはありません、ありがとう!ただし、すべてのシェルで動作するわけではありません(チェック済みのbash、zsh、tcsh。tcshは動作しませんでした)。
ユニックス

使用するnohupジョブ制御シェルには愚かです。最新のシェルはHUPバックグラウンドプロセスに送信しません。一意のファイル名へのリダイレクトは、わずかな代償です。

@chicksのユースケースは、stderrとstdoutが端末を汚染するのを防ぎ、ログファイルを自動的に作成することです。
ブライアム

1
command > file.log 2>&1 & disown少し長いですnohup command &が、@ chicksが示唆していたことだと思います。
-joeytwiddle

31

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

my_command > output.log 2>&1 &

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

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

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


2
ありがとう2>&1、コマンドが失敗し、場合によってはエラーが出力される可能性があるため、非常に重要です!
ericn

1
これは、上記の回答に感謝しなかったときに機能しました。
ドマゴジ

9

見て、画面tmuxは。以下の例tmux

$ tmux new -d 'longrunningcommand'

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

バックグラウンド処理は、長いコマンドを実行してログアウトしたり、切断されたりした場合にも失敗します。システムはジョブを強制終了します。

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

Screenは、試行された古いプログラムです。tmuxはずっと若いですが、スクリーンの過去から学んでいます。


この答えは実際の答えを逃し、RTFMのように聞こえます。
Lloeki

5

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

long_command with arguments > redirection &

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

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


long_command with arguments &> redirection &stderrあまりにもリダイレクトするには
Ice-Blaze

3

を使用してプログラムをバックグラウンドで実行できます&。たとえば、たとえば実行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

stderrとの両方をリダイレクトする場合はstdout、次を使用できます&>

yum install XyZ &> output
yum install XyZ &>> output

2

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

例えば:

areallylong_command &

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

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

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


0

長時間実行されるタスクを開始する前に「screen」コマンドを使用してみてください。デタッチすると、必要に応じて「screen -r -d」で再アタッチできます。sshまたは他のネットワーク接続で端末を使用している場合、サーバーへの接続が不適切なために端末が壊れることがあります。「スクリーン」内で実行すると、この問題が修正されます。

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