systemd を使って自作スクリプトをサービス化してみた

作業環境

systemd とは

systemd とは、Lennart PoetteringKay Sievers を中心に開発された、Linux の起動処理やシステム管理を行う仕組みのことです。

2011年5月にメジャー Linux ディストリビューションFedora に採用され、2014年12月にリリースされた CentOS 7 にも採用されました。

systemd はこれまで使われてきたデーモンごとの起動シェルスクリプトに代わり、『ユニットファイル』と呼ばれる設定ファイルに各デーモン用の初期化命令を記述します。

コマンドを作る

まずは systemd に登録して動作させるスクリプトを用意します。

今回は1秒ごとに現在時刻をログに追記していくスクリプトで試してみたいと思います。

  • /opt/date.sh
#!/bin/bash

while true
do
   date >> /tmp/date.log
   sleep 1
done

実行権限を与えます。

sudo chmod 0755 /opt/date.sh

ユニットファイルを作成する

  • /etc/systemd/system/date.service
[Unit]
Description = date log daemon

[Service]
ExecStart = /opt/date.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

Service セクションの ExecStart に実行したいコマンドを記述します。

Restart はサービスのメインプロセスが停止した際の動作を指定することができ、always を指定することによって、常に再起動を試みます。

サービスとして認識されているか確認する

それでは、作成したユニットファイルがサービスとして認識されているか確かめます。

$ sudo systemctl list-unit-files --type=service | grep date.service
date.service                                disabled

Service として認識されているのが確認できました!

サービスを起動する

それではサービスを起動しましょう。

$ sudo systemctl start date

自動起動の設定も行っておきましょう。

$ sudo systemctl enable date

ステータスの確認を行ってみます。

$ sudo systemctl status date
● date.service - date daemon
   Loaded: loaded (/etc/systemd/system/date.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2016-09-23 14:45:09 UTC; 1h 49min ago
 Main PID: 4168 (date.sh)
   CGroup: /system.slice/date.service
           ├─ 4168 /bin/bash /opt/date.sh
           └─14162 sleep 1

 9月 23 14:45:09 localhost.localdomain systemd[1]: Started date daemon.
 9月 23 14:45:09 localhost.localdomain systemd[1]: Starting date daemon...

サービス起動の確認がとれたので、ログファイルへの書き込みがきちんと行われているかも確認してみます

$ tail -f /tmp/date.log
Fri Sep 23 16:37:31 UTC 2016
Fri Sep 23 16:37:32 UTC 2016
Fri Sep 23 16:37:33 UTC 2016
Fri Sep 23 16:37:34 UTC 2016
Fri Sep 23 16:37:35 UTC 2016
Fri Sep 23 16:37:36 UTC 2016
Fri Sep 23 16:37:37 UTC 2016
Fri Sep 23 16:37:38 UTC 2016
Fri Sep 23 16:37:39 UTC 2016
Fri Sep 23 16:37:40 UTC 2016
Fri Sep 23 16:37:41 UTC 2016
...

ログファイルにもきちんと書き込みが行われているのが確認できました。

まとめ

systemd を使うことによって簡単に自作スクリプトをサービス化して起動することができました。

これから、ユニットファイルの書き方であったり、systemd の概念的なところをもう少し詳しく勉強していきたいと思います。

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド