| | 894 | |
| | 895 | 最初は頑張って `/etc/init.d` の下にスクリプトを書こうかとも思ったのですが、 systemd を使う方法が楽そうだったのでそっちにしました。 |
| | 896 | `/etc/systemd/system/trac.service` ファイルに設定を記述すれば、 `trac` という名前のサービスを登録することが出来ます。 |
| | 897 | |
| | 898 | {{{ |
| | 899 | #!console |
| | 900 | $ sudo vim /etc/systemd/system/trac.service |
| | 901 | }}} |
| | 902 | |
| | 903 | 記述内容は以下の通り。 |
| | 904 | |
| | 905 | {{{ |
| | 906 | [Unit] |
| | 907 | Description=Trac service on uWSGI |
| | 908 | After=network.target |
| | 909 | ConditionPathExists=/var/Developer/trac/original |
| | 910 | |
| | 911 | [Service] |
| | 912 | WorkingDirectory=/var/Developer/trac/original |
| | 913 | ExecStart=/usr/local/bin/uwsgi --ini trac-original.ini |
| | 914 | ExecReload=/usr/local/bin/uwsgi --stop /var/Developer/trac/run/uwsgi-original.pid |
| | 915 | ExecStop=/usr/local/bin/uwsgi --stop /var/Developer/trac/run/uwsgi-original.pid |
| | 916 | Restart=on-failure |
| | 917 | Type=forking |
| | 918 | |
| | 919 | [Install] |
| | 920 | WantedBy=multi-user.target |
| | 921 | }}} |
| | 922 | |
| | 923 | uWSGI はデーモンモードで動かす場合、起動時に処理をすぐにシェルに返す (=子プロセスを起動しっぱなしにして PID ファイルを置いて終了する) ので、 `Type` は `forking` にしておきます。 `User` は不要です (恐らく起動/終了は root で実行されます… アプリケーションの実行ユーザーは uWSGI 側の設定ファイルに記述されているのでそこは気にする必要ないです)。 |
| | 924 | |
| | 925 | 既存の設定ファイルやネットでの情報を見ていて `ExecReload` があれば `ExecStop` は不要なのかとも思ったのですが、両方書いておいたほうが終了を伴う操作時の動作は安定するような気がします (この辺まだちょっと判然とはしてません…)。なお、 `ExecReload` には単に終了するコマンドを記述します (一般的には `/bin/kill -HUP $MAINPD` を呼ぶケースが多いようです…もちろんこれは `Type = simple` や `Type = notify` で動いて systemd 自信が PID を握っている場合の書き方ですが…)。 |
| | 926 | |
| | 927 | サービスを登録し、サービス経由で起動します。念のため、事前に手動で uWSGI を終了しておきましょう。 |
| | 928 | |
| | 929 | {{{ |
| | 930 | #!console |
| | 931 | $ uwsgi --stop /var/Developer/trac/run/uwsgi-original.pid |
| | 932 | $ sudo systemctl enable trac |
| | 933 | $ sudo service trac start |
| | 934 | }}} |
| | 935 | |
| | 936 | Idea Note がちゃんと動いていることを確認。 PID ファイルや UNIX ソケットファイルの存在も確認。 `restart` でちゃんと PID ファイルの PID が変化することや、サーバーを `reboot` しても自動で起動することなども確認済みです。 |