バックグラウンドでプロセスを実行する

バックグラウンドでプロセスを実行する

バックグラウンドでプロセスを開始することについて 2 つの質問があります。

  1. 次のようにバックグラウンドでプロセスを開始するのはなぜですか。

    ./my_program &

    (my_programもちろん exe 権限が設定されています) 他のコマンドのように bash にコマンド プロンプトを印刷させませんか? 点滅するカーソルとともに空の新しい行が残るだけです。

  2. バックグラウンドで次の新しいプロセスを実行すると、bash は次のように何かを表示します。

    ./my_program & [30] 1439 [27] Done ./my_program [28] Done ./my_program [29] Done ./my_program

    これは、バックグラウンドで別の追加プロセスを開始すると、システムが、[27], [28], [29] 現在開始されているプロセス (行) と同じくらい長い間、プレビュー プロセス (行) に関する情報を表示することを意味しますか[30]?

答え1

  1. これは起こるべきではありません。バックグラウンドでコマンドを実行すると、bash は通常、ジョブ番号と pid (下記参照) を出力し、コマンド プロンプトに戻ります。

    私が知っている限り、この状況で bash が新しい行を残す唯一の理由は、コマンドが実際には存在しない場合です。PS1 を印刷した後、何らかの理由でそのエラー メッセージが表示されます。

    $ nonexistant_command &
    [1] 13856
    $
    nonexistant_command: command not found
    <empty line with blinking cursor here>
    

    原因が何であれ、この空の行で Enter キーを押すと、通常のプロンプト (および、生成されたジョブが終了したことを示すメッセージ) を含む新しい行が印刷されます (以下を参照)。

  2. 表示される追加の出力は、現在のバックグラウンド ジョブについて通知する bash です。

    まず、新しく作成されたバックグラウンド プロセスの現在のジョブ番号とその pid が次のように表示されます。

    $ some_command &
    [1] 1234
    

    これは、コマンドsome_commandがジョブ 1 として pid 1234 で実行されていることを意味します。

    バックグラウンド ジョブが完了すると、bash は次にコマンド プロンプトを表示するときに (別のバックグラウンド プロセスを生成したか、フォアグラウンドでコマンドを実行したか、単に空のコマンド ラインで Enter キーを押したかに関係なく)、次のようなメッセージを出力してそのことを通知します。

    [1]  Done                    some_command
    

    これは、実行された番号 1 のジョブsome_commandが終了したことを意味します。

    jobsbash が現在追跡しているバックグラウンド ジョブを確認するには、次のように組み込み関数を使用します。

    $ jobs
    [1]  Running                 some_command &
    [2]  Running                 some_other_command &
    

    ジョブをフォアグラウンドに移動するには、次を使用しますfg

    $ fg 2
    some_other_command
    

    詳細については、help jobs

関連情報