大枠の方針
PCであるソフトを開きながらも起動を待ちながら、別のソフトを開いて、そちらで作業をしている、というように、vagrant
の起動時間も別のことをできるようにします。そのためにはバックグラウンドで起動させておく必要があり、その方法について書いていきます。
フォアグラウンドジョブとは?
LinuxやMac OS Xといったマルチタスク対応のOSにおいて、ユーザーが操作対象にできるジョブを「フォアグラウンド・ジョブ」といいます
まさにいま私はchromeを開いてQiitaでこの記事を書いているのですが、この場合フォアグラウンドジョブはchromeということになります。
バックグラウンドジョブとは?
一方,操作対象になっていませんが、処理を継続しているジョブを「バックグラウンド・ジョブ」といいます。
chrome以外にもterminalやsublimeText、evernoteなどを開いていますが、こちらは私の操作対象になっておりませんので、バックグラウンドジョブということになります。
linuxでやってみる
上記の説明はMac OS上でGUIだったので非常に直感的だったかと思いますが、Linux OSでやっていることも全く一緒です。
vimコマンドを実行してvimのバージョン情報を表示させる例をやってみます。
フォアグラウンドでvimのバージョン情報を表示させる
単にvim
と打ち込めばvimのバージョン情報が確認できます。
[yusuke@Yusukes-MBP myLocalEnvironment]$ vim
簡単ですね。
バックグラウンドでvimのバージョン情報を表示するジョブを実行する
バックグラウンドで実行するためにはコマンドの最後に&
をつけます。
[yusuke@Yusukes-MBP myLocalEnvironment]$ vim &
そうすると上の画像のように処理がバックグラウンドに周り、すぐに次の入力が可能な状況になっています。バックグラウンドにあるジョブをフォアグラウンドに持ってくるためにはfg
コマンドを使います。
[yusuke@Yusukes-MBP myLocalEnvironment]$ fg 2
これで確認することが出来ました。
標準出力を伴うジョブ
vagrant up
のような標準出力を伴うジョブはバックグラウンドで起動させていても、出力が表示されてしまいます。
[yusuke@Yusukes-MBP myLocalEnvironment]$ vagrant up &
この場合は出力先を標準出力から別のファイルへリダイレクトさせなくてはいけません。適当なファイルを作ってそちらへ出力させてもいいのですが、それだと起動するたびにファイルに書き込みがなされていって、無駄に容量を食うことになってしまいます。このようなときのために、いくら書き込んでも、書き込まれたデータを全て捨ててしまうスペシャルファイルのnullデバイスというものが存在します。
/dev/null(nullデバイスとも呼ばれる)は、Unix系オペレーティングシステムにおけるスペシャルファイルの1つで、そこに書き込まれたデータを全て捨て(write システムコールは成功する)、読み出してもどんなプロセスに対してもデータを返さない(EOFを返す)。DOSやWindowsではこれとほぼ同等な機能を提供するNULデバイス[1]がある。
ですので、今回は下記のように起動してやるとバックグラウンドで正常に処理が実行されます。
[yusuke@Yusukes-MBP myLocalEnvironment]$ vagrant up > /dev/null &
上の画像のように起動中のすぐに他の作業に移れるようになっています。また実際に作業していても終了時にはしっかりアラートしてくれます。
コマンド一覧
バックグラウンドやフォアグラウンド関連でよく使うコマンドは下記です。
コマンド | 内容 |
---|---|
& | コマンドに&をつけることでバックグラウンドで実行する |
jobs | バックグラウンドで実行しているジョブの一覧 |
fg [ジョブ指定] | ジョブをフォアグラウンドに持ってくる |
bg [ジョブ指定] | 一時停止中のジョブをバックグラウンドで実行する |
ctrl+Z | フォアグラウンド中のジョブを一時中断する |
ctrl+C | フォアグラウンド中のジョブを終了する |
kill [ジョブ指定] | ジョブを強制終了させる |