最近のLinuxなんですが、chkconfig 系のコマンドがなくなって仕組みが変わってきてるんですよね。systemdに。 ところで、以前ラズパイ上で動かしてるnodejsのアプリをsupervisorをつかってサービス化したのですが、よくよく考えたらサービス化するならsystemdにのっければいいのかなとおもい、ちょっとやってみました。systemdの理解にもよさそうですしね。 自分で下記のような設定でsupervisor上で動かしてたサービスを、systemdにのせかえてみたいと思います。 supervisorで動いてるサービス †$ cat /etc/supervisor/conf.d/iot01.conf [program:iot01] command=sudo npm start directory=/home/pi/app/iot_01/ numprocs=1 redirect_stderr=true stdout_logfile=/var/log/apps/iot_01.log autostart = true user=pi $ sudo supervisorctl status iot01 iot01 RUNNING pid 861, uptime 14 days, 13:43:38 $ sudo supervisorctl stop iot01 iot01: stopped $ sudo supervisorctl status iot01 iot01 STOPPED Jul 09 10:01 AM $ sudo supervisorctl start iot01 iot01: started $ sudo supervisorctl status iot01 iot01 RUNNING pid 22776, uptime 0:00:05 $ iot01というサービス名で /home/pi/app/iot_01/ にあるnodejsのアプリを起動しているだけですね。 事前確認 †$ sudo systemctl list-unit-files --type=service | grep iot $ まだサービスはインストールされていませんが、設定ファイルを下記の場所に置くと $ sudo mv ~/iot01.service /etc/systemd/system/ $ sudo systemctl list-unit-files --type service | grep iot iot01.service disabled $ disableの状態でサービスが認識されます。 サービスの定義 †$ ls -lrt /etc/systemd/system/iot01.service -rw-r--r-- 1 root root 234 7月 9 10:17 /etc/systemd/system/iot01.service $ $ cat iot01.service [Unit] Description= IoT Button Check After=syslog.target network.target ← これらのあとに起動させる [Service] Type=simple # ExecStart=/usr/bin/sudo /usr/local/bin/npm start ← npmは絶対パスにしないと怒られた ExecStart=/usr/local/bin/node index.js WorkingDirectory=/home/pi/app/iot_01/ ←カレントの場所 KillMode=process Restart=always # User=pi ←ユーザの指定 # Group=pi [Install] WantedBy=multi-user.target $ サービスの定義ファイルは上記のようにしておきます。supervisorで指定してるのといろいろ似てますね。 ちなみにsupervisorで動かしてたとき、piユーザからsudo してnpm startしてましたが、npm やsudoだとうまく落ちなかったようで、シンプルにrootで node を起動してます。。この辺よく分かりませんね orz サービスの自動起動設定と開始 †自動起動に設定 $ sudo systemctl enable iot01 Created symlink from /etc/systemd/system/multi-user.target.wants/iot01.service to /etc/systemd/system/iot01.service. $ 所定の場所にシンボリックリンクが張られ、 $ sudo systemctl list-unit-files --type=service | grep iot iot01.service enabled $ enableな状態に設定されました。 ちなみにステータスは下記のように個別にも確認出来ます。 $ sudo systemctl status iot01 ● iot01.service - IoT Button Check Loaded: loaded (/etc/systemd/system/iot01.service; enabled) ←自動起動だけど Active: inactive (dead) ←いまは起動していない $ サービスの開始 $ sudo systemctl start iot01 $ sudo systemctl status iot01 ● iot01.service - IoT Button Check Loaded: loaded (/etc/systemd/system/iot01.service; enabled) Active: active (running) since 日 2017-07-09 18:16:01 JST; 1min 49s ago Main PID: 1538 (node) CGroup: /system.slice/iot01.service └─1538 /usr/local/bin/node index.js 起動されたようです。 ちなみに停止は $ sudo systemctl stop iot01 サービスの自動起動停止は、 $ sudo systemctl disable iot01 となります。 ちなみに昔ながらの $ sudo service iot01 start $ sudo service iot01 stop もつかえるようですね。 TIPS集 †ログを見る †$ sudo journalctl -u iot01 上記のように -u サービス名で、サービス単位でログをみることができます。 $ sudo journalctl -f -u iot01 このように-fすることで、tail -f ぽくすることも。 *.serviceファイルを修正したとき †$ sudo systemctl daemon-reload で反映されます。 状態確認 †$ sudo systemctl -l --type service |grep iot01 関連リンク †
この記事は 現在のアクセス:2204 |