GolangのWebパッケージginを用いて作ったWEBアプリをLinuxサーバーで公開するためのメモ。ポートとかの話の続きです。
今回はアプリ永続化のための部分。
一度実行したらアップデートなどで止めるまで動き続けてくれるようにします。
Linux環境: Ubuntu 16.04.5
アプリ実行の基本
コマンドを実行する
実行権限を付けてそのまま実行する。
そのターミナルで他のことはできなくなる(フォアグラウンド実行)。
1 2 |
$ chmod +x ./someapp $ ./someapp |
バックグラウンド実行する
コマンドに&
を付けるとバックグラウンド実行になり別処理もできるようになる。
ただしログアウト(ターミナル終了)時にはコマンド処理自体も終了する。
1 |
$ ./someapp & |
普通に実行したコマンドもバックグラウンド実行に切り替えが可能。
1 2 3 4 5 6 7 8 9 10 |
//フォアグラウンド実行 $ ./someapp //Ctrl+Zで中断 //中断したジョブを探す $ jobs //バックグラウンド実行に切り替える $ bg ジョブID |
ログアウト時に終了させない実行(nohup, disown)
nohup
はよく使われるコマンドだと思う。
予期しないエラーで止まることもあるのでその辺は注意して使う必要がある。
1 2 3 4 5 6 |
//ジョブとして残るがログアウト時に終了しない $ nohup ./someapp & //コマンド実行後にジョブとして管理させなくするコマンド //killで殺すか処理が終わるまで実行状態 $ disown %ジョブID |
エラーが起きない限りずっと実行する。
デーモンを使ったサービス管理
実行中でもアプリのアップデートがしたいし、エラー終了したら再起動してほしいし、なんならサーバー起動時に勝手に起動してほしい。
基本的にデーモン(daemon)と呼ばれるツールを使って管理します。
以前にnode.jsでのデーモン化ツールを使ったことがありますが今回はより一般的なsystemd
での管理です。
systemdは/etc/systemd/system
にUnit定義ファイルを配置します。
1 2 3 4 5 6 7 8 9 10 |
[Unit] Description = someapp service [Service] ExecStart = /home/bitnami/app/someapp WorkingDirectory = /home/bitnami/app/ Restart = always [Install] WantedBy = multi-user.target |
sudo systemctl list-unit-files --type=service
で追加を確認できます。
今はもう/init.d/
にシェル書かなくていいんですね(今更)。
最低限の設定ですが落ちたとき用にRestart
の設定と、静的ファイル読み込みのためにWorkingDirectory
の設定をしています。
WEBアプリでシングルバイナリ化してないならWorkingDirectory
は必須。
systemdでは基本的にsystemctl
コマンドをつかいます。
サービスを扱う場合、systemctl
コマンドはほぼservice
コマンドと同じと考えてよさそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
##主なコマンド## systemctl status xxx #状態確認 sudo systemctl start xxx #起動 sudo systemctl stop xxx #停止 sudo systemctl restart xxx #再起動 sudo systemctl reload xxx #再読み込み sudo systemctl enable xxx #自動起動ON sudo systemctl disable xxx #自動起動OFF sudo systemctl daemon-reload #Unit定義ファイル再読み込み(変更後必須) journalctl -u xxx #ログ表示 |
わりかし簡単にデーモン化できました。