#topicpath
----

#contents

最近のLinuxなんですが、chkconfig 系のコマンドがなくなって仕組みが変わってきてるんですよね。systemdに。
ところで、以前ラズパイ上で動かしてるnodejsのアプリをsupervisorをつかってサービス化したのですが、よくよく考えたらサービス化するならsystemdにのっければいいのかなとおもい、ちょっとやってみました。systemdの理解にもよさそうですしね。

自分で下記のような設定でsupervisor上で動かしてたサービスを、systemdにのせかえてみたいと思います。

**supervisorで動いてるサービス [#s0281a91]
 $ 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のアプリを起動しているだけですね。


**事前確認 [#ee7056f9]
 $ 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の状態でサービスが認識されます。

**サービスの定義 [#m6406cb7]
 $ 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


**サービスの自動起動設定と開始 [#xf8b85b7]
自動起動に設定
 $ 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
もつかえるようですね。

-[[はじめてのsystemdサービス管理ガイド | Developers.IO>http://dev.classmethod.jp/cloud/aws/service-control-use-systemd/]]

**TIPS集 [#hc8158bd]
***ログを見る [#eaf02807]
 $ sudo journalctl -u iot01
上記のように -u サービス名で、サービス単位でログをみることができます。


 $ sudo journalctl -f -u iot01
このように-fすることで、tail -f ぽくすることも。

*** *.serviceファイルを修正したとき [#t214f7d6]
$ sudo systemctl daemon-reload
 $ sudo systemctl daemon-reload
で反映されます。

*** 状態確認 [#g59026f2]
 $ sudo systemctl -l --type service |grep iot01


**関連リンク [#m7203986]
-[[Systemdを使ってさくっと自作コマンドをサービス化してみる - Qiita>http://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff]] helloworldをサービス化
-[[9.6. システムのユニットファイルの作成および変更>https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html]] Redhatの資料。設定ファイルの項目の説明とか、その他いろいろ
-[[systemd - ArchWiki>https://wiki.archlinuxjp.org/index.php/Systemd?rdfrom=https://wiki.archlinux.org/index.php?title=Systemd_(%E6%97%A5%E6%9C%AC%E8%AA%9E)&redirect=no]] コマンドの例、いろいろ
-[[centos7で標準のsystemdを使いnode.js製サーバーをデーモン化する - Qiita>http://qiita.com/you21979@github/items/588bddb59378ce7303a2]] nodejsのプロセスの件
-[[CentOS7でサービスの管理方法が変わった! - Qiita>http://qiita.com/haisaihiroki/items/c38cb3c0a331db9b6f69]] journalctl についてゴニョゴニョ
-[[「Systemd」を理解する ーシステム管理編ー | ギークを目指して>http://equj65.net/tech/systemd-manage/]]
-[[Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも>http://enakai00.hatenablog.com/entry/20130917/1379374797]]
-[[Linux女子部 systemd徹底入門>https://www.slideshare.net/enakai/linux-27872553]] バイブル的な



----
この記事は
#vote(おもしろかった,そうでもない)


#comment

#topicpath

SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS