Top / Linux / systemd

最近の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

関連リンク


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Linux / systemd

現在のアクセス:2204


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-26 (水) 16:44:12 (2460d)