systemdメモ

論争が耐えないsystemdですが、そろそろ諦めて使わざるを得ないですね。
ということで、設定メモを残しておきます。

# systemdとは

/etc/init.d/に呪文のようなスクリプトを置くのはもう嫌だ！と思って作ったらしいです。([systemd - ウィキペディア](https://ja.wikipedia.org/wiki/Systemd))
なので、systemdを利用しているここ5年ぐらいのディストリビューションは/etc/init.d/配下にファイルがほとんどありません。(networkぐらいじゃないかな。)
amazon linuxも2からsystemdが標準になっています。

/etc/init.d/にいた猛者たちはどこにいったのかというと、`/usr/lib/systemd/` と `/etc/systemd/system/` にいます。

```
[murata@coinpedia-api-ap01 ~]$ cat /etc/system-release
Amazon Linux 2
[murata@coinpedia-api-ap01 ~]$ ll /etc/init.d/                                                                                                                                                                                                                                              
total 40
lrwxrwxrwx 1 root root    54 Jun 23 07:45 cfn-hup -> ../../../opt/aws/apitools/cfn-init/init/redhat/cfn-hup
-rw-r--r-- 1 root root 17500 May  3  2017 functions
-rwxr-xr-x 1 root root  4334 May  3  2017 netconsole
-rwxr-xr-x 1 root root  7293 May  3  2017 network
-rw-r--r-- 1 root root  1160 May  4 08:31 README


[murata@coinpedia-api-ap01 ~]$ ll /usr/lib/systemd/
total 7748
drwxr-xr-x  2 root root     162 Jun 23 07:45 catalog
-rw-r--r--  1 root root    9551 May  4 08:31 import-pubring.gpg
drwxr-xr-x  2 root root      29 Jun 23 07:45 ntp-units.d
-rwxr-xr-x  1 root root    1351 May  3  2017 rhel-autorelabel
-rwxr-xr-x  1 root root     399 May  3  2017 rhel-configure
-rwxr-xr-x  1 root root     110 May  3  2017 rhel-dmesg
-rwxr-xr-x  1 root root     599 Oct 20  2017 rhel-dmraid-activation

~snip;

[murata@coinpedia-api-ap01 ~]$ ll /etc/systemd/system/
total 12
drwxr-xr-x 2 root root  119 Jun 23 07:45 cloud-init.target.wants
lrwxrwxrwx 1 root root   40 Jun 23 07:45 default.target -> /usr/lib/systemd/system/graphical.target
drwxr-xr-x 2 root root   87 Jun 23 07:45 default.target.wants
-rw-r--r-- 1 root root  327 Sep  6 16:52 geth.service
-rw-r--r-- 1 root root  316 Sep  6 16:49 geth.service~
drwxr-xr-x 2 root root   32 Jun 23 07:45 getty.target.wants
drwxr-xr-x 2 root root 4096 Sep  6 16:52 multi-user.target.wants
drwxr-xr-x 2 root root   31 Jun 23 07:45 remote-fs.target.wants
drwxr-xr-x 2 root root   51 Jun 23 07:45 sockets.target.wants
drwxr-xr-x 2 root root  122 Jun 23 07:45 sysinit.target.wants
drwxr-xr-x 2 root root   44 Jun 23 07:45 system-update.target.wants
```


# 使い方は？

## プロセス

systemctlコマンド使うよ。status, start, enable, disableあたりがよく使う。
chkconfigとserviceコマンドが合わさった感じだね。
サブコマンドとサービス名の順番がいつも逆な気がしていつも苛つくね。

```
[murata@coinpedia-api-ap01 ~]$ sudo systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-09-05 16:57:18 JST; 24h ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 3288 (sshd)
   CGroup: /system.slice/sshd.service
           └─3288 /usr/sbin/sshd -D

Sep 06 16:10:15 coinpedia-api-ap01 sshd[14174]: Received disconnect from 118.123.15.142 port 53944:11:  [preauth]
Sep 06 17:00:33 coinpedia-api-ap01 sshd[14716]: Invalid user admin from 37.20.235.105 port 46350
Sep 06 17:00:33 coinpedia-api-ap01 sshd[14716]: input_userauth_request: invalid user admin [preauth]
Sep 06 17:00:34 coinpedia-api-ap01 sshd[14716]: Connection closed by 37.20.235.105 port 46350 [preauth]
Sep 06 17:00:41 coinpedia-api-ap01 sshd[14718]: Invalid user admin from 203.190.148.234 port 45566
Sep 06 17:00:41 coinpedia-api-ap01 sshd[14718]: input_userauth_request: invalid user admin [preauth]
Sep 06 17:00:41 coinpedia-api-ap01 sshd[14718]: Connection closed by 203.190.148.234 port 45566 [preauth]
Sep 06 17:00:46 coinpedia-api-ap01 sshd[14720]: Invalid user admin from 90.151.237.80 port 40770
Sep 06 17:00:46 coinpedia-api-ap01 sshd[14720]: input_userauth_request: invalid user admin [preauth]
Sep 06 17:00:46 coinpedia-api-ap01 sshd[14720]: Connection closed by 90.151.237.80 port 40770 [preauth]
```

## ログ

ログを確認するには`journalctl`コマンドを使うよ。
これだけ覚えておけばよさそう。tailしてくれるよ。 `[root@coinpedia-api-ap01 murata]# journalctl -u [ユニット名] -xf`

```
[root@coinpedia-api-ap01 murata]# journalctl -u sshd.service -xf
-- Logs begin at Thu 2018-08-16 18:05:25 JST. --
Sep 06 17:00:33 coinpedia-api-ap01 sshd[14716]: input_userauth_request: invalid user admin [preauth]
Sep 06 17:00:34 coinpedia-api-ap01 sshd[14716]: Connection closed by 37.20.235.105 port 46350 [preauth]
Sep 06 17:00:41 coinpedia-api-ap01 sshd[14718]: Invalid user admin from 203.190.148.234 port 45566
Sep 06 17:00:41 coinpedia-api-ap01 sshd[14718]: input_userauth_request: invalid user admin [preauth]
Sep 06 17:00:41 coinpedia-api-ap01 sshd[14718]: Connection closed by 203.190.148.234 port 45566 [preauth]
```

## 一覧

動いているサービス: `systemctl list-units --type=service`
全部: `systemctl list-unit-files --type=service`

あんまり使わないから覚えられないね。毎回ググるね。

## 登録(serviceしか使ったことない)

手動で登録するには、`/etc/systemd/system/xxxxx.service`とかってファイルを置けばOKだよ。
ファイルをおいた時点で、 `sudo systemctl status test-deroris.service` とかで確認ができる状態になるよ。


```
❯ cat /etc/systemd/system/test-derori.service
[Unit]
Description=test daemon
ConditionPathExists=/tmp/testdaemon
After=network.target

[Service]
Type=simple
User=root
Group=root
ExecStart=/tmp/testdaemon
PermissionsStartOnly=true

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

起動の順番とか、落ちてたら勝手にリスタートするとかそーいうのも定義できる。/etc/init.d/よりだいぶ見やすいね。(逆に無限再起動に気づかない可能性に注意して！)
全部覚えるのは無理だから似たようなサービスのファイルをコピって使うといいよ。

# 参考

ココを見れば一発だね。

日本語のわかりやすい記事: https://qiita.com/a_yasui/items/f2d8b57aa616e523ede4
公式サイト: https://www.freedesktop.org/wiki/Software/systemd/



# systemd-ask-password

デーモンを起動させるのにパスワードが必要な場合、`systemd-ask-password` というコマンドを使うと、別ttyからパスワードを持ってこれるよ。
sudo 権限を与えたくない場合とか、起動したいデーモンがパスワードを要求してくる場合に利用できるよ。(セキュリティに注意)

こんな感じで使う。

```:/tmp/testdaemon
#!/bin/bash -e

pass=$(systemd-ask-password --keyname=passphrase 'Enter passphrase:')
echo $pass # $passに入力したパスワードが入ってる。
```