systemctl コマンドとは
昔の RedHat 系は Linux 起動時の最初に動く "PID が 1 のプロセス"は init でしたが、最近の RedHat 系 (CentOS, Rocky Linux, Almalinux) は systemd となっています。
systemctl コマンドは、"systemd" をコントロールするコマンドです。
init で使われていた service コマンドと似ていますが、何が違うのでしょうか。
serviceコマンドとの違い
正直、本質的な違いはないです。同じような書式で同じようなことができます。
このコマンドの使い方をまとめてみます。
サービスの開始・停止・再起動・再読み込み
service [サービス名] [命令] に代わるものです。
systemctl [命令] [サービス名] と、順番が変わります。
[postfixサービスの開始]
# systemctl start postfix
[dovecotサービスの停止]
# systemctl stop dovecot
[rsyslogサービスの再起動]
# systemctl restart rsyslog
[squidサービスの再読み込み]
# systemctl reload squid
[httpdサービスの起動状態表示]
# systemctl status httpd
restart (サービス再起動) とreload (設定再読み込み) の大きな違いは、失敗したときの挙動が異なる点です。
再起動で失敗する場合はたいてい、停止は成功して起動が失敗するので、正しく起動するまでの間、サービス停止が発生します。
一方、再読み込みで失敗した場合は、停止をしていないので、設定変更前の状態で起動し続けられます。
list-unit-files = サーバ起動時の自動起動ON OFF
サービスが自動起動するか否かを確認するコマンド(chkconfig --listに代わるコマンド)
# systemctl list-unit-files -t service
enable = 自動起動 ON, disable = 自動起動 OFF です。static や indirect は有効/無効にするようなサービスではなく、他のサービスとの依存関係によって起動する類です。indirect は static と異なり、さらに別のunit ファイルを呼び出します。
依存関係については以下を併せてご参照下さい。
もしくはサービス狙い撃ちで自動起動するかどうかの確認 (postfix が自動起動するか否か)
# systemctl is-enabled postfix
もし "disabled" と返ってきて、自動起動したい場合は
# systemctl enable postfix
逆に "enabled" と返ってきて、自動起動させたくない場合は
# systemctl disable postfix
と打ちます。
また、自動起動を設定しつつ、サービスもすぐに起動させるには --now を付けます。
# systemctl enable --now postfix
list-units = 全サービスの起動状態確認
サービスの起動状態を確認するコマンド
# systemctl list-units -t service
ユニット定義が正しく読み込めている場合は LOAD の列に loaded と表示されます。
ACTIVE の列は active なら実行中、inactive であれば起動していない状態、failed なら起動失敗した状態です。
SUB の列は running と exited のどちらかになります。詳細は本記事の最後尾をご参照下さい。
systemctl status コマンドの見方
起動中の場合はActive:の項目が緑色で active (running) と表示されます。
[root@localhost ~]# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since 木 2017-12-07 07:03:21 JST; 8h left Main PID: 959 (rsyslogd) CGroup: /system.slice/rsyslog.service mq959 /usr/sbin/rsyslogd -n
起動しておらず、起動失敗もしていない場合は Active: の項目が inactive (dead) と表示されます。
[root@localhost ~]# systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:httpd(8) man:apachectl(8) [root@localhost ~]#
起動失敗した場合は Active: の項目が赤字で failed と表示されます。その他問題個所が赤字で表示されます。
[root@localhost ~]# systemctl status postfix ● postfix.service - Postfix Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since 水 2017-12-06 22:23:13 JST; 4s ago Process: 10636 ExecStop=/usr/sbin/postfix stop (code=exited, status=1/FAILURE) Process: 10681 ExecStart=/usr/sbin/postfix start (code=exited, status=1/FAILURE) Process: 10678 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS) Process: 10674 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS) Main PID: 10436 (code=killed, signal=TERM)
running と exited の違い
systemctl status コマンドで起動状態を確認した際、起動中のサービスは Active (running) となっている場合もありますが、Active (exited) と表示される場合もあります。この違いは何でしょうか。
簡単に言うと、running は httpd や postfix 等の、常にクライアントからのアクセスを待ち構えているようなサービス状態のことを指します。常に戦闘モードです。
一方 exited は network サービスに代表されるような、サービス起動時にまず処理が走りますがそれを済ませてしまったらのんびり次に呼び出される機会を待つ状態のことを指します。レスポンスは若干遅いですが来たら対応する、という状態です。
コメント