Systemd
Linuxのシステム管理、起動処理を行う仕組み。SysVinitやupstartなどの起動処理の代替だけではなく、cronなどの処理も置き換えている。2018年現在のLinuxディストリビューションはほぼ全てSystemdを採用している
コマンド
サービス(旧来のデーモンに当たる常駐プロセス)の一覧
$ systemctl list-unit-files --type service
有効なサービスの一覧を見る
$ systemctl list-unit --type service
サービスの状態を確認
$ systemctl status nginx.service
サービスの起動と停止
$ systemctl start nginx.service $ systemctl stop nginx.service
自動起動を有効化する(普通は有効化されているが何らかの原因でdisabledになってしまった場合の修正)
$ systemctl enable nginx.service
一部のサービスにはreload(再起動せずconfigファイルの読み直し)もある。いい感じのbashでは補完機能でreload可能なサービスのみリストアップされる、ただし少し重い。
$ systemctl reload nginx.service
systemd-resolved
systemdで提供されるDNSクライアント。詳細は以下のコマンドで確認できる
$ systemd-resolve --status
systemd-resolvedは名前解決用のサーバを立ち上げている。/etc/resolv.confを見ると
nameserver 127.0.0.53 options edns0 trust-ad search localdomain
のようになっている。systemdで管理されているLinuxサーバ上で各アプリケーションは127.0.0.53をネームサーバとして利用できる。
実際に使用される外部ネームサーバは/run/systemd/resolve/resolv.conf
に書かれている。これを変更したい場合はこのファイルには触らず、netplanを経由して行うとよい
systemd-timesyncd
時刻合わせもsystemdの管理下になり、従来のntpからsystemd-timesyncdに変わっている
$ systemctl status systemd-timesyncd
なお、時刻やタイムゾーンの設定はtimedatectlというコマンドで行う
$ sudo timedatectl set-timezone Asia/Tokyo
現在のTimeZone設定もtimedatectlで確認できる
$ timedatectl Local time: 土 2023-01-28 01:44:40 JST Universal time: 金 2023-01-27 16:44:40 UTC RTC time: 金 2023-01-27 16:44:40 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes NTP service: active RTC in local TZ: no
NTPサーバの指定などは以下のファイルにある
$ less /etc/systemd/timesyncd.conf
すぐに時刻合わせをしたい場合はrestartすると良い
$ sudo systemctl restart systemd-timesyncd
timer
定期実行ジョブを作成できる。cronのようなもの
設定されているタイマーを確認
systemctl list-timers
timerを自作する
例)mysqlバックアップジョブを作る
/etc/systemd/system/backup-mysql.serviceを作成。バックアップスクリプトを起動するジョブを定義
[Unit] Description=backup mysql Wants=mysql.service [Service] Type=oneshot ExecStart=/opt/backup/backup-mysql.sh [Install] WantedBy=multi-user.target
これを有効にする
sudo systemctl enable backup-mysql.service
/etc/systemd/system/backup-mysql.timerを作成。先に作ったserviceをいつ起動するか定義する。時刻はlocal timeが適用される。ファイル名をserviceと同じ名前にしておくと、どのサービスを起動するかの指定(Unit)が不要になるようだ
[Unit] Description=backup mysql timer [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true Unit=backup-mysql.service [Install] WantedBy=timers.target
これを有効にして、タイマーを開始する
sudo systemctl enable backup-mysql.timer sudo systemctl start backup-mysql.timer
バックアップスクリプトはいい感じに作る
- /opt/backup/backup-mysql.sh
#!/bin/bash -e cd /opt/backup/data mysqldump --defaults-extra-file=/opt/backup/backup-mysql.extra --opt --single-transaction --databases hoge > mysql_hoge_buckup.sql gzip mysql_hoge_buckup.sql mv mysql_hoge_buckup.sql.gz "mysql_hoge_buckup.$(date +%Y%m%d).sql.gz" find . -name "*.sql.gz" -mtime +7 -print0 | xargs --no-run-if-empty -0 rm
単にバックアップ目的なら cron.daily に上記のスクリプトを設置する方が楽