blog.monophile.net

コンピュータのこととかのメモ。

山本 一彰 | Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 "論理珠算"を開発し、 それを含む体系である"算道"を構成した。 その成果により、 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を2016年に受賞。 現在はインフラエンジニアとして生計をたててている。

技術

Configuration Management Ansible, Terraform, Cloud-Init
Cloud Platform GCP, AWS, Azure, OpenStack
Virtualization, Container QEMU+KVM, Xen, LXD/LXC, Docker
OS Ubuntu, Debian GNU/Linux, CentOS, FreeBSD, ...
Storage Ceph, GlusterFS, ZFS, btrfs, ...
Router Linux+Netfilter, Quagga, VyOS, Cisco IOS, YAMAHA RTX, ...
Switch Dell FTOS, AlaxalA, NETGEAR, ...
DB MySQL, MariaDB(Galera Cluster), MongoDB
Mail postfix, dovecot, RainLoop
WebApps WordPress, GitLab, MatterMost, Redmine, ...
Monitoring Nagios, Munin, Zabbix, Prometheus, Grafana
Misc Kubernetes/Istio, certbot, dnsmasq, ...

習得中

OS CoreOS(Container Linux), Windows on QEMU, ...
SQL PostgreSQL, BigQuery, ...
NoSQL CouchDB, ArangoDB, Neo4J, ...
Misc Proxmox, oVirt, MAAS, NFV, ...

投稿

systemdで簡単なサービスを定義してみる

概要

いろいろなLinuxディストリビューションで採用されてきているsystemdを理解するために、 “hello world”を一秒ごとに標準出力へ吐き出す簡単なサービスを定義し、 journalctlでログを確認してみた。

内容は↑の記事とほぼ同様になっているが、 下記では標準出力へそのまま“hello world”を出力しているので、 jounarlctlでログを確認できる点で異なる。

systemd

使ったディストリビューションはUbuntuで、systemdのバージョンは229。

$ lsb_release -d
Description:	Ubuntu 16.04.3 LTS
$ systemd --version
systemd 229
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN

/usr/local/bin/hello-daemon.sh

1秒ごとに標準出力に“hello world”を出力するプログラム /usr/local/bin/hello-daemon.sh を用意する。

#!/bin/bash
while true
do
   echo hello world
   sleep 1
done

↓で実行権限をつける。

$ sudo chmod 0755 /usr/local/bin/hello-daemon.sh

/etc/systemd/system/hello.service

hello.service の定義ファイルである /etc/systemd/system/hello.service を用意する。

[Unit]
Description = hello daemon

[Service]
ExecStart = /usr/local/bin/hello-daemon.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

hello.serviceの自動起動を有効にする

↓でhello.serviceの自動起動を有効化できる。

$ sudo systemctl enable hello.service
Created symlink from /etc/systemd/system/multi-user.target.wants/hello.service to /etc/systemd/system/hello.service.

↓で状態の確認。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

hello.serviceを開始する

↓でhello.serviceを開始できる。

$ sudo systemctl start hello.service

↓状態の確認。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-12-08 12:28:32 UTC; 4s ago
 Main PID: 21220 (hello-daemon.sh)
   CGroup: /system.slice/hello.service
           ├─21220 /bin/bash /usr/local/bin/hello-daemon.sh
           └─21235 sleep 1

Dec 08 12:28:32 hostname systemd[1]: Started hello daemon.
Dec 08 12:28:32 hostname hello-daemon.sh[21220]: hello world
Dec 08 12:28:33 hostname hello-daemon.sh[21220]: hello world
Dec 08 12:28:34 hostname hello-daemon.sh[21220]: hello world
Dec 08 12:28:35 hostname hello-daemon.sh[21220]: hello world

hello.serviceのプロセスをkillしてみる

hello-daemon.shのPIDが21220だったので、↓でkillしてみる。

$ sudo kill 21220

systemctl statusで確認すると新しいプロセスがPID 21442で立ち上がったことがわかる。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-12-08 12:31:33 UTC; 3s ago
 Main PID: 21442 (hello-daemon.sh)
   CGroup: /system.slice/hello.service
           ├─21442 /bin/bash /usr/local/bin/hello-daemon.sh
           └─21446 sleep 1

Dec 08 12:31:33 hostname systemd[1]: Started hello daemon.
Dec 08 12:31:33 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:31:34 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:31:35 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:31:36 hostname hello-daemon.sh[21442]: hello world

journalctl でログの確認

hello.serviceのログはjournalctlを使って↓で確認できる。 (-nオプションで5行に制限している。)

$ sudo journalctl -u hello.service -n 5
-- Logs begin at Wed 2017-12-06 05:21:38 UTC, end at Fri 2017-12-08 12:34:45 UTC. --
Dec 08 12:34:41 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:42 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:43 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:44 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:45 hostname hello-daemon.sh[21442]: hello world

hello.serviceの停止

↓でhello.servceを停止できる。

$ sudo systemctl stop hello.service

↓プロセスが止まったことを確認できた。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Fri 2017-12-08 12:39:17 UTC; 6s ago
  Process: 21442 ExecStart=/usr/local/bin/hello-daemon.sh (code=killed, signal=TERM)
 Main PID: 21442 (code=killed, signal=TERM)

Dec 08 12:39:09 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:10 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:11 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:12 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:13 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:14 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:15 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:16 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:17 hostname systemd[1]: Stopping hello daemon...
Dec 08 12:39:17 hostname systemd[1]: Stopped hello daemon.

あとがき

ログの処理は journald で一括して設定できるので楽になった? かも。 (journald の設定ファイルは /etc/systemd/journald.conf にある。)

参考