コマンドの合わせ技でsymfonyを起動する

こんにちは。10月に入社しました三浦です。

10月22日に弊社の引っ越しがありました。
いくつもの机や椅子を組み立てて、新オフィスでの業務を迎えています。
組み立て中は、別の方が持参した電動ドリルが大活躍しました。
バッテリー切れでヘトヘトになっていたので、持ち主の方から電気をもらっていることを祈ります。

さて本題ですが、今回はsymfonyの起動コマンドをコマンドラインで生成させてみます。
symfonyを自習していた当初、手動でifconfigを打ってIPアドレスを確認してからコマンドに入力していましたが、
何回も打っていたのでIPアドレスを自動で取得できる方法を考えてみました。

今回のテーマ

linux搭載のコマンドだけで、symfony起動コマンドを生成する。

前提条件

以下条件の下で、ホストOSのWebブラウザからsymfonyサイトにアクセスすることを考えます。
1. ホストOS:Windows10、VM:ubuntu18.04
2. 両方ともIPアドレスはDHCPによる自動付与とする。
3. VM上でsymfonyを稼働させる。

ポイント

3の前提より、単にserver:startを実行するだけではアクセスできません。

php bin/console server:start

代わりに、アクセスするIPアドレスとポート番号を明示して起動します。

php bin/console server:start {VMのIPアドレス}:{port番号}

IPアドレスの取得

ifconfigの出力結果から、IPアドレス(XXX.XXX.XXX.XXXの部分)を抜き出してみます。
ここでは、ホストOSと通信できるVM側のNICをeth0とします。

$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet XXX.XXX.XXX.XXX  netmask YYYY.YYY.YYY.YYY  broadcast ZZZ.ZZZ.ZZZ.ZZZ
        inet6 aaaa::bbbb:cccc:dddd:eeee  prefixlen 64  scopeid 0x0<global>
        ether ff:gg:hh:ii:jj:kk  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfigの結果から抜き出すコマンドは以下の通りです。

echo `ifconfig eth0 | grep inet | grep -v inet6 | awk -F' ' '{ print $2 }'` … (a)

symfony起動コマンドの生成

(a)のコマンドを実行して出力されるIPアドレスをシェル変数に格納し、symfonyの起動コマンドを作成します。
なお、ポート番号は8000番を指定しています。

cd {起動するプロジェクト名}
SERVER_IP=`ifconfig eth0 | grep inet | grep -v inet6 | awk -F' ' '{ print $2 }'`
php bin/console server:start ${SERVER_IP}:8000

もう一工夫する

symfony起動中の時に server:start を実行するとエラーになってしまいますので、symfonyが停止中の時だけコマンドを発行するようにします。
今回は、プロジェクトフォルダ直下に「.web-server-pid」がなければ、symfony停止中と判断します。
if文を使って、symfony停止中の判断を追加します。

cd {起動するプロジェクト名}
if [ ! -f .web-server-pid ]; then
  echo `ifconfig eth0 | grep inet | grep -v inet6 | awk -F' ' '{ print $2 }'`
  php bin/console server:start ${SERVER_IP}:8000
fi

これで、IPアドレスを都度取得してsymfonyを起動するコマンドが出来上がります。
別ファイルに保存して適切なパーミッションを設定すれば、ワンタッチでsymfonyを起動するシェルとになります。

最後に

小さいコマンドながら、自分で作れたときは達成感を感じました。
これからも学ぶことは多いですが、今回のような達成感を糧に進んでいきます。