systemd とサービスの起動・停止

友人がサーバ機にFedora19をインストール。頼まれて、メールサーバを構築することになったのですが、/etc/init.d/ に起動・停止スクリプトがない!

私自身はFedora12以降システム系をいじっていなかったので、すっかり時代遅れになっていました。Fedora15からは、デフォルトでSystemV風ではなくなりsystemdが採用されているんですね。というわけですっかり浦島太郎な私は、脱rc.dしなければなりません。

systemctl の使い方

ユニットを使う

ユニットには、例えば、サービス (.service) やマウントポイント (.mount)、デバイス (.device)、ソケット (.socket) などがあります。

コマンドsystemctlを使うとき、一般的には拡張子 (suffix) を含むユニットファイルの完全な名前を指定する必要があります。例えば、sshd.socketのようにです。しかし、サービスユニットの場合には、拡張子を省略することができます。httpd.serviceの代わりにhttpdと記述することができます。

ユニットの確認

実行中のユニットを一覧する

$ systemctl

あるいは

$ systemctl list-units

もしもserviceのみ表示したい時には

$ systemctl list-units --type=service

インストールされたユニットを一覧する

$ systemctl list-unit-files
サービス(ユニット)ごとの状態確認
$ systemctl status [service_name].service
サービス(ユニット)のスタート・ストップ等
# systemctl start [service_name].service

# systemctl stop [service_name].service

# systemctl restart [service_name].service

# systemctl reload [service_name].service

そのほかのコマンドとして、try-restartreload-or-restartreload-or-try-restart等があります(もちろんサービスユニット以外のユニット用のコマンドも多数あります)。

サービス(ユニット)の登録
# systemctl enable [service_name].service
サービス(ユニット)の停止
# systemctl disable [service_name].service

具体例

httpdサーバをインストールしてみることにしましょう。

# yum install httpd

すると
/lib/systemd/system/httpd.service が作成されます。
ファイルの中身を見てみると、

# less /usr/lib/systemd/system/httpd.service

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop

# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

となっています。一つだけ忘れないようにしておきたいと思うのは、サービスに [Install] セクションがない場合、大抵は他のサービスから自動的に起動される、ということでしょうか。

httpdを実行させるには、

# systemctl start httpd.service

とします。サービスの状態を確認するには、

# systemctl list-units --type=service

で、表示されるサービスの一覧の中に、

httpd.service          loaded active running The Apache HTTP Server

を見つけることができます。

サービスを止めるのは、

# systemctl stop httpd.service

です。

サービスの状態を表示(動いているかどうかなど)

$ systemctl status httpd.service

有効化(起動時に自動で実行するよう設定)されているかどうか表示

$ systemctl is-enabled httpd.service

サービスを手動ではなく、システム起動時に自動で開始する

# systemctl enable httpd.service

システム起動時に実行されないように無効化する

# systemctl disable httpd.service

とりあえずはこれでシステムのサービスについてはOKでしょう。

コメントを残す