アプリケーションをバックグラウンドで実行する利点が何なのか、よく分かりません。コマンド ライン経由の
ようなものでしょうか。Application &
アプリケーションをバックグラウンドで実行する理由は何でしょうか。また、いつ実行すべきでしょうか。
答え1
一般的に、実行に時間がかかり、ユーザーの操作を必要としないアプリケーションは、ターミナルで作業を続行できるようにバックグラウンドに送られます。
バックグラウンドで実行されているジョブは、STDOUT、STDIN、および STDERR が可変であることを除き、フォアグラウンドで実行されているジョブと同じように扱われます。
ファイルの圧縮やバックアップなど、時間がかかりすぎるジョブがある場合は、それらのジョブをバックグラウンドに送信できます。
コマンドを使用して、バックグラウンドで実行されているジョブを一覧表示できますjobs
。
$ ./job1.sh &
[1] 9747
$ ./job2.sh &
[2] 9749
$ ./job3.sh &
[3] 9751
$ jobs
[1] Running ./job1.sh &
[2]- Running ./job2.sh &
[3]+ Running ./job3.sh &
ここで、ジョブがバックグラウンド シェルに送信されるたびに、プロセスが表示されますjob id
。pid
プロセスをフォアグラウンドに戻したい場合は、fg
コマンドを使用して戻すことができます。
$ fg 1
./job1.sh
ただし、ターミナル (シェル) を閉じると、シェルから生成されたすべてのバックグラウンド プロセスに SIGHUP が送信され、それらのプロセスが終了してしまうことに注意してください。これを防ぐには、disown
コマンドを使用してジョブ テーブルからそれらのプロセスを削除し、プロセスが強制終了されるのを防ぐことができます。
最善の方法の 1 つは、コマンドを使用してバックグラウンド プロセスを開始することですnohup
。これにより、SIGHUP シグナルによってプロセスが強制終了されることはなく、バックグラウンドで安全に実行されます。
huponexit
bash シェルのオプションを設定することで、SIGHUP が子プロセス (bg ジョブ) に送信されないようにすることもできます。
$ shopt -s huponexit
このオプションは最新バージョンの Bash ではデフォルトで設定されていますが、設定されていない場合は、これを追加して~/.bashrc
デフォルトの動作にすることができます。
答え2
たとえば、コピー ジョブのように、終了までに 5 分かかるアプリケーションを実行する場合、プログラムの実行中、つまり 5 分間はシェルがブロックされます。コピー ジョブは、サインインで示される、いわゆるフォアグラウンド プロセス グループ内にあります+
。ps
その 5 分間に他の作業を行う必要がある場合もありますが、シェルはブロックされます。
一方、コピー ジョブをバックグラウンドで実行すると ( )、ジョブは現在のシェルをブロックすることなくバックグラウンドで実行されます。他の作業を続行できます。必要に応じて、cp source target &
でプロセスをフォアグラウンドに戻すことができます。fg