systemdわからん

かったので簡単に調べた。相変わらずのチラ裏メモなのでご容赦。

まず、従来のLinuxではカーネルが立ち上がったあとにinitプロセスというのが最初に立ち上がるりこれがすべてのプロセスの親プロセスになっていろんなデーモンやらを起動させていく、というプロセス（これは単に「過程」の意）を踏んでいたらしい。そして
Ubuntu 15.04以降ではこのinitプロセスにsystemdが採用されたということだ。

> System Init Daemon
This has changed as part of the Ubuntu 15.04 devel cycle.
Ubuntu 15.04 (using Systemd by default):
Systemd runs with PID 1 as /sbin/init.
Upstart runs with PID 1 as /sbin/upstart.

[Ubuntu公式wiki](https://wiki.ubuntu.com/SystemdForUpstartUsers)より。また実際、Ubuntu15.04では

```
Neko-no-te% ls -l /sbin/init
lrwxrwxrwx 1 root root 20  6月  3 08:29 /sbin/init -> /lib/systemd/systemd
```

となっていた。

次に各処理の扱いについて。systemdでは各処理を"Unit"という単位で扱っている。このUnitにはいくつか種類があって、例えばservice（とりあえず、特定の役割を果たすための一連のプロセス（または群）という理解をしています）を管理するUnitは拡張子が`.service`で終わるファイル担っていたりする。また自動生成されるユニットもあって、それらについては設定ファイルなどは存在しない模様。現在実行中のUnit、実行可能なUnitファイルはそれぞれ、

```
systemctl
systemctl list-unit-files
```
コマンドで確認することができる。

ユーザーが新たにUnitを定義する場合には、`/etc/systemd/system/`以下に設定ファイルを書く。例えば、apt-getで入ったnginxのserviceファイルは以下のようになっていた（これは`/lib/systemd/system/`以下にあった。ディレクトリ配置については多分いままでのLinux哲学に準じたものになっていると思われる）。

```

# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target
```

Unitファイルの記述については適当にググること。以下参考になりそうなページ。

http://itpro.nikkeibp.co.jp/article/COLUMN/20140708/569987/?ST=oss&P=1
https://sites.google.com/site/kandamotohiro/systemd/man-systemd-unit-no-yi
https://wiki.archlinuxjp.org/index.php/Systemd

簡単な使用方法としては、

```
systemctl (-t TYPE) # ->現在稼働している(TYPE:たとえばserviceタイプとかの)Unitを列挙

systemctl list-unit-files (-t TYPE) # ->現在設定ファイルが用意されている（TYPE:たとえばserviceタイプとかの)Unitを列挙

systemctl enable/disable <unit name> # -> 自動起動の有効化、無効化

systemctl stop/start <unit name> # -> Unitの停止、開始

systemctl status <service name> # -> serviceの稼動状態確認

systemctl kill -s9 <service name> # -> serviceに含まれるプロセスをすべてkill

```
あたりを知っておけばとりあえず良いだろう。

systemdと連携したロギングシステムとしてjournaldというのが働いているらしいが、今回は詳しく取り上げない。とりあえず、-uオプションでUnit名を指定することで、特定のUnitのログにアクセスできるようだ。

```

Neko-no-te% journalctl -u nginx.service
-- Logs begin at 月 2015-09-28 15:26:48 JST, end at 月 2015-09-28 22:25:59 JST. --
 9月 28 15:26:50 Neko-no-te systemd[1]: Starting A high performance web server and a reverse proxy server...
 9月 28 15:26:50 Neko-no-te nginx[805]: nginx: [emerg] unknown directive "more_set_headers" in /etc/nginx/nginx.conf:27
 9月 28 15:26:50 Neko-no-te nginx[805]: nginx: configuration file /etc/nginx/nginx.conf test failed
 9月 28 15:26:50 Neko-no-te systemd[1]: nginx.service: control process exited, code=exited status=1
 9月 28 15:26:50 Neko-no-te systemd[1]: Failed to start A high performance web server and a reverse proxy server.
 9月 28 15:26:50 Neko-no-te systemd[1]: Unit nginx.service entered failed state.
 9月 28 15:26:50 Neko-no-te systemd[1]: nginx.service failed.
```

これから各種サービス管理のメインストリームになっていくみたいなので、それなりに触れ合っていきたい。