654
@DQNEO

Systemdを使ってさくっと自作コマンドをサービス化してみる

この記事は最終更新日から5年以上が経過しています。

Systemdの仕組みをつかうと、自分で作ったコマンドを簡単にサービスとして登録することができます。

例として、hello worldを延々とファイルに書き込むコマンドをサービス化してみましょう。

1. コマンドを作る

/opt/hello.sh というスクリプトを用意します。

sudo nano /opt/hello.sh
/opt/hello.sh
#!/bin/bash
while true
do
   echo hello world >> /tmp/hello.log
   sleep 1
done

実行権限を与えます。

sudo chmod 0755 /opt/hello.sh

2. /etc/systemd/system/ の下にUnit定義ファイルを作る

sudo nano /etc/systemd/system/hello.service

中身はこんなんです。

/etc/systemd/system/hello.service
[Unit]
Description = hello daemon

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

[Install]
WantedBy = multi-user.target

ExecStartに実行したいコマンドを書きます。
Restart = always はプロセスやサーバが不意に落ちた時に自動再起動するモードです。

Unitファイルの詳しい書き方については下記記事を参考にしてください。
Systemd入門(1) - Unitの概念を理解する - めもめも
Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも

(Type = simpleはデフォルトでそうなってるので書く必要ないのですが、書いたほうがわかりやすい
ので明示的に書く方がよいでしょう)

3. UnitがServiceとして認識されたか確認する

systemctl list-unit-files --type=serviceの出力に現れればOKです。

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

OK!

4. enableしてstartする

ここまでくれば、後はいつものように普通のサービスとして扱えます。

# 自動起動on
$ sudo systemctl enable hello
# 起動
$ sudo systemctl start hello

ステータス確認

$ sudo systemctl status hello

hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled)
   Active: active (running) since 金 2015-06-19 09:02:19 UTC; 2min 54s ago
 Main PID: 551 (hello.sh)
   CGroup: /system.slice/hello.service
           ├─ 551 /bin/bash /opt/hello.sh
           └─2062 sleep 1

 6月 19 09:02:19 localhost.localdomain systemd[1]: Started hello daemon.

ファイルへの書き込みが行われているか確認

[vagrant@localhost ~]$ tailf /tmp/hello.log
hello world
hello world
hello world
hello world
hello world

動いてました!

5. マシンを再起動して、サービスがちゃんと自動起動するか確認

$ sudo reboot

再起動後、マシン内でちゃんとhelloサービスが稼働していればOKです。

supervisordの代わりにsystemdで代用できそう

従来はコマンドのサービス化をするツールとしてはsupervisordやdaemontoolsなどが代表的でしたが、今後はSystemdだけでいけるかもしれません。

アプリケーションサービスなどもsystemd管理下へ
init だとクラッシュした時の再起動がないので、よくアプリケーションサービスなどを supervisord や daemontools を使って別に起動させていた方も多いと思いますが、基本的には systemd がこれらも含めてすべて見るようにするのが理想的ということです。cgroupを使ってプロセスツリー全体のリソースも管理でき、ログ管理機能もあるのでsystemd管理下に置くほうがシステム全体として整合性も取れるような印象です。
また従来はdaemonizeすることが多かったところsystemdではdaemontoolsのようにforegroundで実行するのが基本的なスタイルになるようです。Typeを変えればforkするデーモンにも対応可能です。

ぐぐってもあまり事例が出てこなかったのですが、すでに本番でsystemdによるサービス化をやってるよ、などがあればコメントで教えていただけると幸いです。

654
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
DQNEO
PHP/Go/Perl/C/Docker/Linux/Git/AWS
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
この記事は以下の記事からリンクされています
s_szksystemdのお勉強からリンク
過去の31件を表示する

コメント

質問でもよろしいでしょうか。本記事を元にmplayerの動画をWiHiで自動で受ける設定をしました。GUI画面に有るLxterminalから手入力すると正常に動画がでるのですが、自動起動にするとCLI画面で実行ファイルを送ったように画面が出なくなります。pingは通るので接続は確保しています。画像はnetcatでポートを指定するだけでサーバーに送っています。アドバイスいただけたら助かります。

0
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
Microsoft Igniteに参加してイベントに関する記事を投稿しよう!
~
新人プログラマ応援 - みんなで新人を育てよう!
~
ユーザーは見つかりませんでした