逆引き:Ubuntu環境で自分で作ったサービスをシステムに登録する
最近は新型コロナや国際情勢についてのエントリばかり上げていましたが、テック系のエントリも上げようと思います。
備忘録的内容で、Ubuntu環境で自分が作ったサービスをシステムに登録する方法
です。
今回は、サーバー型の自作アプリケーションをシステムに登録したいと思います。
systemd に開発したサービスを登録する
Ubuntuでは、systemd でサービスが管理されています。
サービス定義ファイルは /etc/systemd/system
以下に配置されています。
各サービスは、*.service
というファイルで定義されています。
ディレクトリ内容の抜粋はこちらです。
drwxr-xr-x 15 root root 4096 Apr 23 13:21 ./
drwxr-xr-x 5 root root 4096 Feb 6 06:42 ../
drwxr-xr-x 2 root root 4096 Jul 22 2019 default.target.wants/
drwxr-xr-x 2 root root 4096 Jul 22 2019 final.target.wants/
drwxr-xr-x 2 root root 4096 Jul 22 2019 getty.target.wants/
drwxr-xr-x 2 root root 4096 Jul 22 2019 graphical.target.wants/
lrwxrwxrwx 1 root root 38 Jul 22 2019 iscsi.service -> /lib/systemd/system/open-iscsi.service
drwxr-xr-x 2 root root 4096 May 22 07:20 multi-user.target.wants/
drwxr-xr-x 2 root root 4096 Jul 22 2019 network-online.target.wants/
drwxr-xr-x 2 root root 4096 Jul 22 2019 open-vm-tools.service.requires/
drwxr-xr-x 2 root root 4096 Jul 22 2019 paths.target.wants/
drwxr-xr-x 2 root root 4096 Jul 22 2019 sockets.target.wants/
lrwxrwxrwx 1 root root 31 Jul 22 2019 sshd.service -> /lib/systemd/system/ssh.service
drwxr-xr-x 2 root root 4096 Jul 22 2019 sysinit.target.wants/
lrwxrwxrwx 1 root root 35 Jul 22 2019 syslog.service -> /lib/systemd/system/rsyslog.service
drwxr-xr-x 2 root root 4096 Jul 22 2019 timers.target.wants/
今回は、サーバー型の自作アプリケーションをシステムに登録したいので、ディレクトリ /multi-user.target.wants
の下に、サービス定義ファイルを作成します。
では、/multi-user.target.wants
の中身を見てみましょう。
サービス定義ファイルの実態は /lib/systemd/system
以下に配備されていることがわかります。
drwxr-xr-x 2 root root 4096 May 22 07:20 ./
drwxr-xr-x 15 root root 4096 Apr 23 13:21 ../
lrwxrwxrwx 1 root root 31 Jul 22 2019 atd.service -> /lib/systemd/system/atd.service
lrwxrwxrwx 1 root root 32 Jul 22 2019 cron.service -> /lib/systemd/system/cron.service
lrwxrwxrwx 1 root root 36 Jul 22 2019 ebtables.service -> /lib/systemd/system/ebtables.service
lrwxrwxrwx 1 root root 41 Jul 22 2019 hibinit-agent.service -> /lib/systemd/system/hibinit-agent.service
lrwxrwxrwx 1 root root 38 Jul 22 2019 irqbalance.service -> /lib/systemd/system/irqbalance.service
lrwxrwxrwx 1 root root 33 Jul 22 2019 lxcfs.service -> /lib/systemd/system/lxcfs.service
lrwxrwxrwx 1 root root 42 Jul 22 2019 lxd-containers.service -> /lib/systemd/system/lxd-containers.service
lrwxrwxrwx 1 root root 47 Jul 22 2019 networkd-dispatcher.service -> /lib/systemd/system/networkd-dispatcher.service
lrwxrwxrwx 1 root root 33 Sep 25 2019 nginx.service -> /lib/systemd/system/nginx.service
(・・・中略・・・)
lrwxrwxrwx 1 root root 31 Jul 22 2019 ssh.service -> /lib/systemd/system/ssh.service
lrwxrwxrwx 1 root root 44 Jul 22 2019 systemd-networkd.service -> /lib/systemd/system/systemd-networkd.service
lrwxrwxrwx 1 root root 44 Jul 22 2019 systemd-resolved.service -> /lib/systemd/system/systemd-resolved.service
lrwxrwxrwx 1 root root 36 Nov 8 2019 td-agent.service -> /lib/systemd/system/td-agent.service
lrwxrwxrwx 1 root root 31 Jul 22 2019 ufw.service -> /lib/systemd/system/ufw.service
自前サービスの定義する
ここでは、/lib/systemd/system/my-app.service
というファイルに、自前サービスの定義を書き込みます。
[Unit]
Description=my-app: This is my server application
After=network-online.target
[Service]
ExecStart=/var/myapp/bin/start.sh
ExecStop=/var/myapp/bin/stop.sh
ExecReload=/var/myapp/bin/reload.sh
Restart=no
Type=forking
[Install]
WantedBy=multi-user.target
Unit
セクションには、登録するサービスの基本情報を記入します。Description
に、登録するサービスの説明を記入します。After
には、このサービスを起動する前に実行しておくサービスユニットを指定します。network-online.target
と指定したので、/network-online.target.wants
以下に配備されているサービスを先に起動しておくことを指示します。
Service
セクションでは、登録するサービスの起動・再起動・停止といった挙動の定義をします。ExecStart
には、サービス起動時のコマンドを定義します。ExecStop
には、サービス停止時のコマンドを定義します。ExecReload
には、サービスリロード時のコマンドを定義します。Restart
には、サービス再起動時の条件を指定するのですが、デフォルトであるno
を指定します。Type
には、サービスプロセスの起動を完了する方法を指定します。ExecStart
で定義したコマンドで起動したプロセスが常駐する場合は、simple
を指定します。ExecStart
で定義したコマンドが、バックグラウンドで複数のプロセスを立ち上げ、自身は終了する処理をする場合はforking
を指定します。- ウェブサーバー的な、マルチプロセスで処理をするようなサーバーの場合、
forking
に該当します。
- ウェブサーバー的な、マルチプロセスで処理をするようなサーバーの場合、
Install
セクションでは、このサービスをシステムに登録する際の設定を定義します。WantedBy
には、このサービスをどのサービスユニットに登録するのか指定します。- ここでは
multi-user.target
というサービスユニットに登録します。
- ここでは
シンボリックリンクを張ってサービス定義を配備する
Ubuntuのシステムにサービスを認識させるには、/etc/systemd/system
以下にサービス定義ファイルを配備する必要があります。
ここでは、シンボリックリンクを張ることでサービス定義ファイルを配備します。(ほかのオープンソースサービスと同じ作法を踏襲します)
# ln -s /lib/systemd/system/my-app.service /etc/systemd/system/multi-user.target.wants/my-app.service
systemctl コマンドを使ってサービスを登録する
サービス定義が配備が終わったら、systemctl
コマンドを使って、サービスをシステムに登録します。
# systemctl enable my-app.service
Synchronizing state of my-app.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable my-app
サービスが起動するか確認する
systemctl
コマンドを使って、サービスが起動するか確認します。
まずサービスを起動します。
# systemctl start my-app
続いて、サービスの状態を確認します。
# systemctl status my-app
● my-app.service - my-app: This is my server application
Loaded: loaded (/lib/systemd/system/my-app.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-05-** 09:46:45 UTC; 5s ago
Process: **** ExecStart=/var/myapp/bin/start.sh (code=exited, status=0/SUCCESS)
Main PID: **** (****)
(・・・中略・・・)
May ** 09:46:45 ip-10-40-41-85 systemd[1]: Starting my-app: This is my server application
May ** 09:46:45 ip-10-40-41-85 sudo[1806]: root : TTY=unknown ; PWD=/ ; USER=**** ; COMMAND=/var/app/bin/
May ** 09:46:45 ip-10-40-41-85 sudo[1806]: pam_unix(sudo:session): session opened for user **** by (uid=0)
May ** 09:46:45 ip-10-40-41-85 my-app[****]: Process seems to be down... Rebooting...
May ** 09:46:45 ip-10-40-41-85 sudo[1806]: pam_unix(sudo:session): session closed for user ****
(・・・中略・・・)
May ** 09:46:45 ip-10-40-41-85 systemd[1]: Started my-app: This is my server application
Active: active (running)
という記述が確認できました。サービスが無事起動していることを意味します。
後は、サーバーを試験的に再起動して、登録したサービスがちゃんと起動しているか、systemctl
コマンドで確認しましょう。
これで、自分で作ったアプリケーションをUbuntuのシステムに登録することができました。
ということで…
テック系のエントリも今後は少しずつ書き溜めていこうと思います。
ある程度たまったら、逆引き用の索引を作ろうかと思います。
毎回断片化された情報を調べなおすより、生産的でしょう。
こちらのエントリも併せてどうぞ!
目次 1 逆引き:Ubuntu環境で自分で作ったサービスをシステムに登録する1.1 systemd に開発したサービスを登録する1.2 自前サービスの定義する1.3 シンボリックリンクを張ってサービス定義を配備する1.4 systemctl コマンドを使ってサービスを登録する1.5 サービスが起動す […]
目次 0.1 概要0.2 インストール手順0.2.1 Hyper-V を有効化0.2.2 Docker Desktop for windows をインストールする0.2.3 インストーラーの起動0.2.4 インストール処理0.3 Docker Desktop の起動0.4 Docker Deskto […]
目次 1 今回はこのブログサイトのウェブサーバー構築のお話から1.1 Let\’s Encrypt について2 Let\’s EncryptのSSL証明書をインストールする環境について3 certbot のインストール4 certbotを使ったドメインの登録とSSL証明書の取 […]