デーモン(サービス)とは
主にバックグラウンド(標準入出力から切られている状態)で動作しているプロセス(プログラム)のことです。
常に動かすプロセスはデーモンにするのが一般的です。
OS上では様々なプロセスがデーモンとして起動していて、有名なプロセスだと名前の最後に
d
が付いているのがお決まりです。
- httpd
- sshd
- crond
- named
Unix, Linuxではデーモン、Windowsではサービスと呼ばれることが多いです。指してるものは同じです。
initとは
私たちがターミナルでコマンドを叩いてプロセスを起動するのと同様に、プロセスを起動するためのプロセスが必要です。
そのため、一番最初に起動するプロセスをきめ、それが他のプロセスを起動していきます。
OSが起動する際は
- ブートローダがカーネルを起動
- カーネルがinitデーモンを起動
- initデーモンが各種プロセスを起動
という流れになっています。
initシステムの1つであるSysVinitは昔から使われており、仕組みが単純であるため今でも使われていることも多いです。また、一部のOSでは互換性のためにsystemdとinitの両方が使えるようになっていることもあります。
/etc/init.d/
ディレクトリに起動や停止の処理を書いたシェルスクリプト(hoge.sh)を作成し、
/etc/init.d/hoge start
コマンドを叩くとサービスが開始されます。
実行したい内容をシェルスクリプトで書くため、挙動を自由度高く制御できます。一方、起動スクリプトに問題がある際に気付きにくい等の問題があります。
また、実行順序設定に従い1つずつ実行していく(並列起動できない)ため、systemdに比べて諸々の起動に時間がかかるという問題もあります。
systemdとSysVinitは基本部分から大きく違いますが、設定ファイルを作り、サービス登録し、startコマンドを叩くという操作の流れは変わりません。
systemdとは
SysVinitに様々な問題点があるため、新たに開発されたソフトウェアの集まりです。
initデーモンだけではなく、ログ管理デーモンなど、様々なソフトウェア全体のことを指します。
最近はデフォルトでsystemdが有効になっているディストリビューションが多数派になってきています。
-
システムおよびサービスの管理
systemctl
コマンド -
ログ管理
journalctl
コマンド - システムユーザ、グループ管理
- ログインセッション管理
- デバイス管理
などなど多くの機能があり、解説だけで本が書けます。
サービス管理では並列化機能による高速化などのメリット、ログ管理では高速かつ検索しやすいなどのメリットがあります。
systemdでは各種リソースをunitという単位で考えます。unitは扱うものによって11種類のタイプに分類されています。
systemctl list-units -a
コマンドで現在扱っているunitの一覧を見ることができます。
語尾についている
.service
や
.socket
などがタイプです。
※ここで出るserviceはWindowsのサービスとは別物です。unitのタイプの一つにserviceという名前がついているだけです。
今回の講義では、システムの起動・停止、サービスの登録について軽く触れます。
systemdでサービス登録・起動・停止(演習)
systemdで扱うサービスはシステム管理者(root)で扱う必要があり、すべてのコマンドにsudoをつける必要があります。
今回は付け忘れによる権限付与ミス等を防ぐため、rootユーザで操作します。
※ログや誤操作の観点から、本来はrootユーザでの操作は望ましくないです。演習なので許してください。
最初に、rootユーザになります。
% sudo su -
ユーザとカレントディレクトリを確認してください。
# whoami
root
# pwd
/root
まず、/root/date_memory.shをルートユーザで作成します。
# vim date_memory.sh
#!/bin/bash
while true
do
var1=`date`
var2=`cat /proc/meminfo | grep "MemFree"`
echo ${var1} ${var2} >> /tmp/date_memory.txt
sleep 3
done
実行権限を付けます。
どうやって?
# chmod +x date_memory.sh
今回は作成したdate_mamory.shをサービスとして登録します。
Unit定義ファイルを作成します。
/etc/systemd/system/date_memory.service
# vim /etc/systemd/system/date_memory.service
[Unit]
Description = date_memory daemon
[Service]
ExecStart = /root/date_memory.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
中身の説明は省略します。適切にUnitファイルを書けばサービスとして認識されることが理解できれば良いです。
Unitがサービスとして認識されたかを確認します
# systemctl list-unit-files --type=service
量が多いので、date_memoryという文字列で絞り込みをしてください
どうやって?
# systemctl list-unit-files --type=service | grep date_memory
自動起動、起動設定します。
# systemctl enable date_memory
# systemctl start date_memory
ステータスを確認すると実行されているのが見えます。
# systemctl status date_memory
書き込み先の
/tmp/date_mamory.txt
を見てください。
常に動いているので、3秒以上待つと書き込み先も更新されるはずです。
今回の設定では
Restart = always
と記述したので、再起動後も自動で実行されるはずです。
再起動後にもう一度
/tmp/date_mamory.txt
を見てください。
# reboot
(再起動後、もう一度ssh接続したあとにrootになっておく)
% sudo su -
余談
/tmp
ディレクトリ
一時的なファイルを置くためのディレクトリで、再起動すると中身がすべて消えます。
再起動後に
/tmp/date_mamory.txt
を見ると、再起動後の時間からのデータしか無いはずです。これは、システムを落としたタイミングでファイルごと消えているからです。
他にも特殊な性質を持つディレクトリなので、名前くらいは覚えておいて損はないです。
サービスを止めます。
# systemctl stop date_memory
ステータスを確認すると停止しているのが見えます。
# systemctl status date_memory
systemd-journald(ちょっと演習)
systemdのログ管理を行うプロセスです。systemdとは独立しています。
systemd-journaldが様々な場所(カーネル・syslog・systemd各unitの標準(エラー)出力など)からログ情報を収集し、journalとして蓄積・管理します。
journalから人間が読める形式でログを見るコマンドが
journalctl
です。試しに叩いてください。
% journalctl
当然ですが、大量のログが出てきます。
先ほど作ったdate_memoryデーモンのログを見てみます。
※力技で絞り込む方法
% journalctl | grep date_memory
-f
オプションをつけるとリアルタイムでログを追いかける事ができます。
date_memoryサービスをもう一度動かして 、以下コマンドでログを見てみてください。
※オプションとして絞り込みを指定する方法
% journalctl -f -u date_memory.service
journalctlの様々な引数、journaldそのものの設定など、便利に使う機能は沢山ありますので、業務内外で使うとなった時は調べてみてください。
※systemdパートの内容は時間等の制約のため、かなり大雑把な説明になっています。この内容だけで「俺はinit / systemd完全に理解してます!」なんて言うと多方面からしっかり怒られます。
今回の講義では、systemdの概略、systemctlコマンドを使ってサービスの登録、起動、停止が行えることを理解できれば良いです。
今回は説明しませんが、cronのように時間設定をして起動等もできます(timer unit)。興味が出たら・業務で詳しく使うことになったら、この資料内容を足掛かりに詳しく調べてください。