非同期シェルコマンド


100

シェルスクリプトを使用してコマンドを起動しようとしています。それがいつ、いつ、どのように、なぜ終了するかは気にしません。プロセスを開始して実行したいのですが、すぐにシェルに戻れるようにしたいのですが...


2
関連する、nohup、disown、&の違いについては、UnixおよびLinux Stack Exchangeを参照してください。
jww 2016年

1
違いについて協議することをより詳細な答えをお探しの方のためにnohup&とはdisown第四の答えにスクロールするには、ここクリックしてください
noɥʇʎԀʎzɐɹƆ

回答:


116

バックグラウンドでスクリプトを実行するだけです。

$ myscript &

これは&、スクリプト内に配置することとは異なることに注意してください。


1
トンのおかげで、それが何か簡単になることはわかっていました... Linuxは私のものではありませんが、スピードを上げようとしています...ところで、これはnohupと組み合わせると機能しますか?
LorenVS 2010

2
&をコマンドラインに配置することとスクリプトに配置することの違いは何ですか?それらが異なることに気づきませんでした。
Jacob Sharf 2013

8
@JacobSharf、試してみてください。場合&スクリプト内であり、あなたが持っていないwait、バックグラウンドコマンドは、いつスクリプトが終了殺されます。
Carl Norum、2013

ああ。それは多くのことを説明しています。私は最近、それによって引き起こされるいくつかの影響に気づきました。実際にグーグルすると、このページに移動します。ありがとう
Jacob Sharf 2013

myscript端末環境を変更する場合、例:それはすぐに必要ではなく、遅延する可能性がある端末初期化コマンドですが、それでも端末環境は変更されますか?
noɥʇʎԀʎzɐɹƆ

58

誰もが忘れましたdisown。だからここに要約があります:

  • & ジョブをバックグラウンドで実行します。

    • 入力を読み取ろうとするとブロックします。
    • シェルがその完了を待たないようにします。
  • disown シェルのジョブ制御からプロセスを削除しますが、ターミナルに接続されたままにします。

    • 結果の1つは、シェルがaを送信しないことですSIGHUP(シェルがを受信した場合は、プロセスにSIGHUPもを送信SIGHUPします。これにより、通常、プロセスが終了します)。
    • そして、明らかに、これはバックグラウンドジョブにのみ適用できます(フォアグラウンドジョブの実行中は入力できないため)。
  • nohup端末からプロセスを切断し、その出力をリダイレクトしnohup.outてから保護しSIGHUPます。

    • プロセスは送信されSIGHUPたものを受け取りません。
    • これはジョブ制御から完全に独立しており、原則としてフォアグラウンドジョブにも使用できます(ただし、それほど有用ではありません)。
    • 通常&(バックグラウンドジョブとして)使用されます。

disownDebianやOS Xでは見つかりません。プログラムだと思っていましたが、間違っているようです。それは何ですか?
jww


6
これが最良の答えです。最も包括的な。
noɥʇʎԀʎzɐɹƆ

3
確かに最良の答えは、なぜこれほど少ないのアップ分からない
HeberLZ

1
@VladGanshin号
アニメノン

39
nohup cmd

端末を閉じてもハングアップしません。デフォルトでは、出力はnohup.outに送られます

これを背景と組み合わせることができます

nohup cmd &

そして出力を取り除きます

nohup cmd > /dev/null 2>&1 &

disownコマンドも使用できます。タイプcmdCtrl-Zbgdisown


2
すべてがどのように組み合わされているのか、クールでクレイジーです。最初は順序付けが
理解しやすい

今夜、私はこれに出会いました。私は2日間、シェルスクリプトを使用して戦っていましたが、この提案はうまくいきました。どうもありがとうございます!
JD Long、

これはとても便利です。バックグラウンドモードで実行しているときは、を使用してコマンドの出力を時々確認できtail nohup.outます。これにより、コマンド出力の最後の10行が表示されます。これをrsyncバックアップジョブに使用して、現在どのファイルにあるかを確認します。
Martin Hansen

これを実行したが、バックグラウンドプロセスを停止したい場合はどうなりますか?
Stephan Bijzitter 2016

この目的でジョブを正確に開始すると、シェルはジョブIDを出力します。を使用すると、実行中のジョブをいつでも確認できますjobs
Tripleee

26

または、プログラムを実行した後、Ctrl-Zを押してプログラムを停止し、次のように入力することもできます。

bg

最後に停止したプログラムをバックグラウンドで実行します。(「&」なしで何かを開始し、それを再起動せずにバックグラウンドで引き続き使用したい場合に便利です)


2
ありがとう、それはクールな小さなトリックです...シェルの良さの一部を本当に理解し始めています...
LorenVS

3

screen -m -d $command$切り離されたセッションでコマンドを開始します。を使用screen -rして、開始されたセッションにアタッチできます。これはすばらしいツールで、リモートセッションにも非常に役立ちます。詳しくはをご覧くださいman screen


@LadenkovVladislav RedHatにスクリーンをインストールできると私は95%確信しています。CentOSを使用しています。
BuvinJ

Ubuntuでは、Windows /バッチの「開始」コマンドをエミュレートしたいと思っていました。つまり、フォアグラウンド(gui)プログラムを非同期で起動し、シェルスクリプトを続行します。これはまさにそれを行います。
BuvinJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.