これからSystemd入門する

# 目的
Systemdについて、改めて調査したのでその備忘録。

# Systemdとは
Linuxの起動処理やシステム管理を行う仕組み。
CentOS7より採用。

# Linuxの起動処理
* 電源投入によりBIOSが起動する。
* BIOSからブートローダーが呼び出される。
* ブートローダーがLinuxカーネルを起動する。
* Linuxカーネルがinitプロセス(PID 1)を起動する。
* Systemdはinitプロセスにあたる。
![78692eb8438a92f7e11a516981ad7fad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262745/8595c696-acb1-a1c1-0970-5a2c8d0c9252.png)

[出典]
(https://dev.classmethod.jp/cloud/aws/systemd-getting-started/)


# 特徴

## シェルスクリプトではない

- これまで使われていた、Sysvinitは全て1つのシェルスクリプト内に処理として書かれていたため細分化できなかった

- Sysvinitにまとめられていた個々の処理を抜き出しUnitという単位で管理


- 並列実行や依存関係を持たせたりできるように。

## 起動が柔軟に行える

- システム起動時以外の契機をトリガーにできる

## 定義ファイルの場所

- /etc/systemd/system 

管理者がカスタマイズ、こちらが優先実行

- /usr/bin/lib/systemd/system

デフォルトの設定、基本的には触らない


# Unitの操作
## Unitの一覧表示

```bash
$ systemctl list-unit-files
```


## Unitの自動起動、無効化

```bash
$ systemctl enable/disable <UNIT>
```

## Unitの手動起動、停止

```bash

$ systemctl start/stop <UNIT>
```



# Unitファイルの構成
Unitファイルは主に3つのセクションに分類されます。
1. Unitセクション
	- Unitの説明や、依存関係を記述する設定項目
2. Service セクション
	- 固有の設定項目
3. Installセクション
	- systemctl enable/disableコマンドの動作に影響する設定項目

実際のUnitファイルを例に、各セクションの設定方法を確認してみましょう。

## 例
nginxのUnitファイルを見てみましょう。

```shell
$ cat /usr/lib/systemd/system/nginx.service 

## Unitの説明や依存関係などを記述
[Unit]
Description=The nginx HTTP and reverse proxy server
##このUnitより先に起動するUnit
After=network.target remote-fs.target nss-lookup.target


## 固有の設定オプション
[Service]
## サービスプロセスの起動完了の判定方法(デフォルトはsimple)
Type=forking
## メインプロセスのPIDファイル
PIDFile=/run/nginx.pid
## サービス起動前の追加コマンド
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
## サービスの起動コマンド
ExecStart=/usr/sbin/nginx
## サービスリロードコマンド
ExecReload=/bin/kill -s HUP $MAINPID
##systemctl stopコマンドでどのシグナルを送るか
KillSignal=SIGQUIT
## 停止完了までに待機する時間
TimeoutStopSec=5
## 停止せず残ったプロセスの扱い
KillMode=process
## サービス専用の/tmp、/var/tmp/を作成するかどうか
PrivateTmp=true

## systemctl enable/disable時の挙動を設定する。
## multi-user.targetを起点にした依存関係が作成され(シンボリックリンクが作られる)、OS起動時に実行されるようになる。
[Install]
WantedBy=multi-user.target

```

## 各セクションの設定項目
### Unitセクション

主なオプションは下記の通りです。


| オプション| 説明 |
|----|----|
| Description| Unitの説明文 |
| After | このUnitより先に起動するUnit |
| Before | このUnitより後に起動するUnit |

### Serviceセクション

主なオプションは下記の通りです。

| オプション| 説明 |
|-----|----|
| ExecStart|サービス起動コマンド  |
| ExexReload |サービスリロードコマンド  |
| ExecStop| サービス停止コマンド |
| ExecStartPre/Post| サービス起動前後のコマンド  |
| ExecStopPost| サービス停止後に実行するコマンド |
| Type| サービスプロセスの起動完了の判定方法、デフォルトは`simple` |
| PIDFIle| fork型サービスのメインプロセスのPIDファイル |
| Restart| サービスプロセス停止時の再起動条件 |
| PrivateTmp| このサービス専用の/tmpと/var/tmpを用意するかどうか |
| TimeoutStopSec| 停止完了までに待機する時間の設定、指定時間内に終了しなかった場合、矯正終了する |
| KillMode|  ExecStopで停止せずに残ったプロセスの処理方法 |
| KillSignal|  サービスの終了時にどのシグナルを使用するか |


### Installセクション
主なオプションは下記の通りです。


|オプション| 説明 |
|--------|--------|
|WantedBy|enable時にこのUnitの.wantsディレクトリにリンクを作成する  |
|Requiredby |enable時にこのUnitの.requiredディレクトリにリンクを作成する  |



## Type=forkingについて

> 「Type」は、「ExecStart」で指定したコマンドでサービスのプロセスを起動した際に、起動完了をどのように判定するかを指定します。たとえば、フォアグラウウンドで実行を継続するコマンドであれば、「Type=simple」とします。これは、コマンドを実行したタイミングで起動完了と判断します。あるいは、子プロセスをフォークしてバックグラウンドにまわして、最初のコマンド自体は終了するタイプであれば、「Type=forking」とします。この場合は、実行したコマンドが終了した時点で起動完了と判断します。

[Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも](http://enakai00.hatenablog.com/entry/20130917/1379374797)


# 参考

下記の記事を大いに参考にした。
わかりやすい。
~~正直こちらを読めば事足りる。~~

[Linux女子部　systemd徹底入門](https://www.slideshare.net/enakai/linux-27872553)
http://enakai00.hatenablog.com/entry/20130917/1379374797