注目キーワード

Ubuntu環境で自分で作ったサービスをシステムに登録する方法

逆引き: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 サービスが起動す […]

目次 1 今回はこのブログサイトのウェブサーバー構築のお話から1.1 Let\’s Encrypt について2 Let\’s EncryptのSSL証明書をインストールする環境について3 certbot のインストール4 certbotを使ったドメインの登録とSSL証明書の取 […]

最新情報をチェックしよう!