unicornの自動起動(ubuntu20.04でのsystemd)

# はじめに
unicornとnginxの連携、init.dではなく、systemdで自動起動させるのが今風らしいじゃないですか。早く言ってよね…。（とはいえ自動起動できればどっちでも良いと思います）
最初init.dでやったのがこちら↓

https://qiita.com/devzooiiooz/items/568f44d2ebb283e2ffe6
### 環境
Ubuntu20.04
rails6
unicorn
nginx

## 参考
https://qiita.com/piggydev/items/50f8d9d958f42445493f

https://lab.unicast.ne.jp/2017/11/20/start-unicorn-rails-manually-or-systemd/

# Unitファイル[unicorn.service]の作成
/etc/systemd/system/にunicorn.serviceを作ります。
パーミッションは644にするのが流儀のようです。
chownは/etc/以下なのでsudoでroot:rootのままで大丈夫。

```sh:sh
sudo touch /etc/systemd/system/unicorn.service
chmod 644 /etc/systemd/system/unicorn.service
```
picoなどで編集

```sh:/etc/systemd/system/unicorn.service
[Unit]
Description=The unicorn process
Before=nginx.service
After=network.target remote-fs.target nss-lookup.target

[Service]
User=hoge #ここはrailsのWorkingディレクトリのユーザーで良い
WorkingDirectory=/home/hoge/rails/hoge #フルパスで
SyslogIdentifier=unicorn
PIDFile=/home/hoge/rails/hoge/tmp/unicorn.pid #超大事。フルパスで
Type=simple

Restart=on-failure

Environment=RAILS_ENV=production #適宜developmentなど
Environment=UNICORN_CONF=/home/hoge/rails/hoge/config/unicorn.rb #フルパスで

ExecStart=/bin/bash -l -c 'bundle exec unicorn_rails -c ${UNICORN_CONF} -E ${RAILS_ENV} -D'
ExecStop=/usr/bin/kill -QUIT $MAINPID
# The unicorn process is gracefully restarted with `kill -USR2 <PID>` along with the setting
# in the before_fork hook in config/unicorn.rb.
# ref: https://tachesimazzoca.github.io/wiki/rails3/unicorn.html
ExecReload=/usr/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
```
### 書式の確認

```sh:sh
sudo systemd-analyze verify /etc/systemd/system/unicorn.service
```
### はまったところ
参考にしたところのUnitファイルにPIDFileの記述がありませんでした。
これがなくても書式チェックは正常。そして起動もします（すぐこけるけど）。
以下は必須

```sh:/etc/systemd/system/unicorn.service
[Service]
PIDFile=/home/hoge/rails/hoge/tmp/unicorn.pid #超大事。フルパスで
```

### 変数展開はEnvironmentの部分のみ
DRY原則に則って、極力無駄な記述は避けたいと思い、
WorkingDirectoryを変数W_DIRに入れて展開したいよね、とか考え、
以下のように記述してみましたがNGです。
Environmentは変数入れれるのになんでや…。

```sh:/etc/systemd/system/unicorn.service
##以下はダメな例ですのでコピペしないでね
[Service]
WorkingDirectory=W_DIR=/home/hoge/rails/hoge #変数W_DIRに代入
SyslogIdentifier=unicorn
PIDFile=${W_DIR}/tmp/unicorn.pid #NG
Type=simple

Restart=on-failure

Environment=RAILS_ENV=production #適宜developmentなど
Environment=UNICORN_CONF=${W_DIR}/config/unicorn.rb  #NG

ExecStart=/bin/bash -l -c 'bundle exec unicorn_rails -c ${UNICORN_CONF} -E ${RAILS_ENV} -D'
```
### 設定が完了したら以下.serviceは付けなくてもいいようです。
起動時に自動起動させたい場合は
sudo systemctl enable unicornは必須!

```sh:sh
sudo systemctl daemon-reload
sudo systemctl enable unicorn
sudo systemctl start unicorn
sudo systemctl status unicorn
```
systemctlに登録できたらserviceコマンドでもいけます。
shellではstart,stopが後ろに来るのでserviceコマンドの方が使えると思う。

```sh:sh
sudo service unicorn start
sudo service unicorn stop
sudo service unicorn status
```

## psコマンドのおさらい
色々あったのでpsの使い方について補足。
#### 参考
https://qiita.com/toshihirock/items/565fe71d778d3ee36b96

http://wordpress.honobono-life.info/lin-base/ps%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%83%85%E5%A0%B1%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/

```sh:
$ ps -ef | egrep 'PID|unicorn' | grep -v grep
#スレッド一覧は以下
$ ps -eLf | egrep 'PID|unicorn' | grep -v grep
```