Ubuntu18.04でスクリプトを自動起動させる

Ubuntu16.04あたりから導入されたSystemdを使って、サーバー起動時にシェルを自動起動させる手順。

自動起動させるサンプルシェル

任意の場所にあるNode.jsのプログラムを起動させてみる。(通常はpm2を使うのがセオリーだが、適当なサンプルがないので)

> cd /home/hoge/sample
> vi start.sh
#!/bin/sh

cd /home/hoge/sample
node /home/hoge/sample/index.js

サービス化の手順

まず、定義ファイルを/lib/systemd/system直下に作成する。名前はhoge.serviceのように末尾が.serviceになるようにする。

> cd /lib/systemd/system
> sudo vi hoge.service

最低限?必要な項目のみ記載する。(いろんな機能、振る舞いが定義できそうだが、一番シンプルなサービスになると思われる。

ExecStartで実行するシェルを指定する。Typeもいろいろあるが、simpleでとりあえず定義する。

[Unit]
Description=demo sample node.js program

[Service]
Type=simple
ExecStart=/home/hoge/sample/start.sh
Restart=always

[Install]
WantedBy=multi-user.target

定義ファイルが作成できたら、以下のコマンドで認識されているか確認する。最初はDisableになっているはず。

> sudo systemctl list-unit-files --type=service | grep hoge
hoge.service            disable

サービスを有効にする方法は以下のコマンド。有効になると、/etc/systemd/system以下にhoge.serviceのシンボリックリンクが作成される。

> sudo systemctl enable hoge

逆に無効にしたい場合は、

> sudo systemctl disable hoge

サービスの開始とステータス確認は以下になる。

> sudo systemctl start hoge
> sudo systemctl status hoge
● hoge.service - demo sample node.js program
   Loaded: loaded (/lib/systemd/system/hoge.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-08-07 06:28:14 UTC; 4s ago
 Main PID: 2119 (start.sh)
    Tasks: 7 (limit: 1026)
   CGroup: /system.slice/hoge.service
           ├─2119 /bin/sh /home/hoge/sample/start.sh
           └─2120 node index.js

あとは、この状態でマシンを再起動してしばらく経ったあとに自動的に目的のプログラムが自動起動していることを確認できればOK。