Linuxでユニットファイルを作って自動起動させる

PHPのビルトインサーバとNode.js Express アプリケーション用のビルトインサーバのユニットファイルを作成して自動起動できるようにしました。 凝ったことをしないのであれば、service ファイルを作成するだけでOKなので簡単です。

実行させるコマンドは以下です。

  • PHP
  • php -S 0.0.0.0:8000 public/index.php -t public
  • Node.js
  • node ./bin/www

service ファイルに書くときは、 php コマンドや node コマンドをフルパスで書くと確実に動くので、パスを確認しておきます。

$ which php
/usr/bin/php
$ which node
~/.nvm/versions/node/v16.11.1/bin/node

確認したら、service ファイルを作ります。ファイル名はなんでもOKです。ここではphp.servicenodejs.serviceとします。

  • /etc/systemd/system/php.service
[Unit]
Description = serve php

[Service]
ExecStart = /usr/bin/php -S 0.0.0.0:8000 public/index.php -t public
Restart = always
Type = simple
WorkingDirectory = /home/ec2-user/php-app
User = ec2-user
Group = ec2-user

[Install]
WantedBy = multi-user.target
  • /etc/systemd/system/nodejs.service
[Unit]
Description = serve nodejs

[Service]
ExecStart = /home/ec2-user/.nvm/versions/node/v16.11.1/bin/node ./bin/www
Restart = always
Type = simple
WorkingDirectory = /home/ec2-user/nodejs-app
User = ec2-user
Group = ec2-user

[Install]
WantedBy = multi-user.target

WorkingDirectory にアプリケーションのルートディレクトリを指定して ExecStart にコマンドを指定します。他の項目については説明できないので各々で調べてください。

それでは、ビルトインサーバを起動しましょう

$ sudo systemctl start php
$ sudo systemctl start nodejs

開始したら状態を確認します。以下のようになっていればOKです。

$ sudo systemctl status php
● php.service - serve php
   Loaded: loaded (/etc/systemd/system/php.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-10-14 01:30:20 UTC; 1h 8min ago
 Main PID: 10612 (php)
   CGroup: /system.slice/php.service
           └─10612 /usr/bin/php -S 0.0.0.0:8000 public/index.php -t public

$ sudo systemctl status nodejs
● nodejs.service - serve nodejs
   Loaded: loaded (/etc/systemd/system/nodejs.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-10-14 02:16:43 UTC; 23min ago
 Main PID: 8875 (node)
   CGroup: /system.slice/nodejs.service
           └─8875 /home/ec2-user/.nvm/versions/node/v16.11.1/bin/node ./bin/www

自動起動の設定をする場合は、以下コマンドを実行してください。

$ sudo systemctl enable php
$ sudo systemctl enable nodejs