【rso】コマンド一発でサーバ起動に加えて自動でlocalhost:3000ページを開く方法[Rails/Linux]

#**はじめに**
Railsのローカルサーバーを立ち上げる際は、`rails s`コマンドをターミナルから実行し、立ち上がりを確認でき次第Chromeなどのブラウザから`localhost:3000`にアクセスするのが通例だと思います。しかし、この方法だと2度のステップを踏むことになりますし、待機時間など無駄な時間が発生していました。そこで、**何度も行う操作はスクリプトを書いて自動化することで効率化を図りたい**と思い、エイリアスを設定することにしました。

注：個人的には、エイリアスはスクリプトの簡易版であると考えています。
コマンドをいくつか連結させる程度であればエイリアスで十分でしょう。

#**目標**
ターミナル上で`rso`(rails, sleep, open)と打つと下記のようにサーバが起動し、自動的にchrome上でlocalhost:3000ページが立ち上がるようにすることが目的です。

```terminal.
$ rso
[1] 13024
=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

#**設定完了までの流れ**
##**1.エイリアスの設定**
`.bashrc`ファイルに下記を追記します。

```~/.bashrc
alias rso='rails s & sleep 10; open "http://localhost:3000"'
```
###**バックグラウンドプロセス**
コマンド末尾に`&`をつけて呼び出すとバックグラウンドプロセスになり、並列で実行されます。
###**「;」演算子**
`;`で連結した場合、一つ目のコマンドの実行の**成否に関わらず**二つ目のコマンドは実行されます。

###**sleepコマンド**
指定した時間だけ処理を遅延（シェルを停止）させることができます。
オプションで単位を指定することができますが、数値のみを指定した場合、指定した**数値秒**間だけ処理を遅延することとなります。

###**補足**
コマンドを連結する演算子は他にも用意されていますが、「処理が失敗すると次のコマンドが実行されない」とか「処理が成功すると次のコマンドが実行される」など、今回の場合には適していませんでした。
というのも、`rails s`はexitしたのちに処理が完了ということになるため、今回は処理の完了に関係なく実行される`;`演算子を利用する必要があります。

また`sleep`コマンドには数値の10を指定していますが、こちらは、サーバが立ち上がる目安時間で指定しています。というのも、サーバが立ち上がる前にchromeでページが開いてしまうと、`This site can’t be reached`というエラーが発生してしまうためです。ですので、処理速度には様々な要因がありますが、主なところでいうと、PCの性能によるところが大きいので、すぐに立ち上がるという方（性能の良いPCをお持ちの方）は数値を`3~5`ぐらいで設定しても問題ないでしょう。


##**2.シェルに設定を読み込ませる**
```terminal.
$ source ~/.bashrc
```

##**3.実行**
下記のコマンドを実行してサーバが起動し、ブラウザ上でページが開くと完了です。

```terminal.
$ rso
[1] 13024
=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

#**補足**
ここでは、実行中のプロセスの確認方法と切断方法をご紹介します。

##**実行中のプロセスを確認**
下記のいづれかの方法で確認すれば良いでしょう。
###**1.サーバを指定**
development環境で動かしているサーバは`puma`だとします。

```terminal.
$ ps | grep puma
13433 ttys000    0:05.21 puma 3.12.0 (tcp://0.0.0.0:3000)
```
###**2.ポート番号を指定**
下記では、3000番ポート利用中のプロセスを確認しています。

```terminal.
$ lsof -i:3000
COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    13433 takuyanin   10u  IPv4 0x1b38de6785cc87f2      0t0  TCP *:hbci (LISTEN)
```

###**3.server.pidファイルの中身を確認**
```terminal.
$ cat tmp/pids/server.pid
13433
```

##**プロセスを停止**
上記のコマンド群で確認したプロセスIDを指定して、プロセスを停止します。

```terminal.
$ kill 13433
- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2018-12-30 07:33:32 +0900 ===
- Goodbye!
Exiting
```

#**参考資料**
[シェルコマンド1行で複数コマンドや条件に応じた実行をする](https://qiita.com/wwwaltz/items/9ee247ee8fe3ab63fd27)
[ sleep - 指定した時間だけ処理を遅延 - Linuxコマンド](https://webkaru.net/linux/sleep-command/)


#**おわりに**
「サーバ起動からのブラウザで立ち上げ」の自動化に関して、より良い方法があれば教えていただけると嬉しいです。

こちらの記事が役に立ったという方は、いいね、よろしくお願いします(^^)

また、[takuyaninのマイページ](https://qiita.com/takuyanin)にRails, Rubyに関していくつか記事をまとめてますので、よければご参考ください。