systemctlコマンドでLinuxのサービスを管理する方法|start・stop・enable・statusの使い分けも

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxサーバー構築(Rocky Linux/RHEL9) > systemctlコマンドでLinuxのサービスを管理する方法|start・stop・enable・statusの使い分けも
「サービスを再起動したいのに、コマンドが分からない」
「startとenableの違いって何?」

サーバー管理の現場でsystemctlの操作に戸惑う方は多くいます。RHEL系だけでなくUbuntuでも同じコマンドが使えるにもかかわらず、意外と体系的に整理できていないケースが少なくありません。

この記事では、systemctlコマンドの基本から実務で必要な操作まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みの実行例を使って解説します。start・stop・enable・disableの違いから、ユニットファイルの確認・作成まで一通りカバーしています。

この記事のポイント

・systemctl start/stop は「今すぐ」、enable/disable は「次回起動時から」の設定
・systemctl status でサービス状態・直近ログを一度に確認できる
・--now オプションで enable+start を1コマンドで同時実行できる
・Failed 状態は journalctl -u でユニット単位のログを確認するのが最短ルート


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

systemctl とは何か

systemctl は、systemd を採用した Linux ディストリビューション全般でサービス(ユニット)を管理するコマンドです。2015年ごろ以降の主要ディストリビューション(RHEL 7以降・Ubuntu 15.04以降・Debian 8以降)はほぼすべて systemd を採用しており、事実上「現代 Linux のサービス管理コマンド」と言い切れます。

旧来の SysVinit 環境では service コマンドや chkconfig コマンドを使っていましたが、systemd 環境では systemctl に一本化されています。chkconfig から systemctl への移行についてはこちらも参照してください。

systemd が管理する単位を「ユニット(Unit)」と呼びます。ユニットの種類は多岐にわたりますが、日常的に操作するのは主に以下の2つです。

サービスユニット(.service):デーモンプロセスの起動・停止を管理する
ソケットユニット(.socket):ポートを監視してサービスをオンデマンド起動する

本記事では .service ユニットを中心に解説します。

サービスの状態を確認する(status)

まず最も使用頻度が高い status サブコマンドを確認します。サービスの起動状態・プロセスID・直近のログ出力を一度に確認できます。

1. サービスの詳細状態を表示する

# sshd サービスの状態を確認する $ sudo systemctl status sshd * sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled) Active: active (running) since Fri 2026-05-02 09:15:42 JST; 3h 22min ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 1187 (sshd) Tasks: 1 (limit: 23161) Memory: 5.8M CPU: 124ms CGroup: /system.slice/sshd.service └─1187 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups" May 02 09:15:42 web01.example.com sshd[1187]: Server listening on 0.0.0.0 port 22. May 02 09:15:42 web01.example.com sshd[1187]: Server listening on :: port 22.

出力の読み方は以下の通りです。

Loaded: ユニットファイルの読み込み状態。enabled(次回起動時に自動起動する設定)か disabled かを示す
Active: 現在の起動状態。active (running) が正常稼働中
Main PID: メインプロセスのPID
・下部のログ行:journald が収集した直近のログを表示

2. 全サービスの一覧を表示する

# 全ユニットを一覧表示(サービスのみ) $ systemctl list-units --type=service UNIT LOAD ACTIVE SUB DESCRIPTION auditd.service loaded active running Security Auditing Service crond.service loaded active running Command Scheduler firewalld.service loaded active running firewalld - dynamic firewall daemon NetworkManager.service loaded active running Network Manager postfix.service loaded active running Postfix Mail Transport Agent sshd.service loaded active running OpenSSH server daemon ... LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state. SUB = The low-level unit activation state. 52 loaded units listed. # 停止中のサービスも含めて表示する $ systemctl list-units --type=service --all

サービスを起動・停止・再起動する(start / stop / restart)

1. サービスを今すぐ起動する

# httpd サービスを起動する $ sudo systemctl start httpd # 起動後に状態を確認する $ sudo systemctl status httpd * httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled) Active: active (running) since Fri 2026-05-02 10:02:11 JST; 5s ago

2. サービスを今すぐ停止する

# httpd サービスを停止する $ sudo systemctl stop httpd

3. サービスを再起動する

設定ファイルを変更した後に反映させるには restart または reload を使います。

# プロセスを完全に再起動する(接続が一瞬切れる) $ sudo systemctl restart httpd # 設定ファイルだけ再読み込みする(プロセスを落とさない) $ sudo systemctl reload httpd # reload が失敗したら restart にフォールバックする $ sudo systemctl reload-or-restart httpd

reload と restart の使い分けはサービスによります。Apache や Nginx のように設定の再読み込みに対応しているサービスは reload で済ませることで、接続中のクライアントへの影響を最小化できます。

自動起動を設定する(enable / disable)

start と stop は「今この瞬間」の操作です。OS 再起動後も自動起動させるには enable、逆に自動起動を無効にするには disable を使います。

1. 自動起動を有効にする

# 自動起動を有効にする(次回起動から適用される) $ sudo systemctl enable httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service. # 自動起動の有効化 + 今すぐ起動を1コマンドで行う(--now オプション) $ sudo systemctl enable --now httpd

enable コマンドは /etc/systemd/system/ 以下にシンボリックリンクを作成することで「自動起動」を実現しています。実際のユニットファイルは /usr/lib/systemd/system/ に存在し、enable はそこへのリンクを張る操作です。

2. 自動起動を無効にする

# 自動起動を無効にする $ sudo systemctl disable httpd Removed /etc/systemd/system/multi-user.target.wants/httpd.service. # 自動起動の無効化 + 今すぐ停止を1コマンドで行う(--now オプション) $ sudo systemctl disable --now httpd

3. 自動起動の設定状態だけを確認する

# enabled か disabled かを確認する $ systemctl is-enabled httpd enabled # active(起動中)か否かを確認する $ systemctl is-active httpd active

start と enable の違い(混同しやすいポイント)

現場でよく見かけるミスが「enable したのに起動していない」「start したのに再起動後に止まっていた」という混乱です。

start:今すぐサービスを起動する。再起動後は反映されない
stop:今すぐサービスを停止する。再起動後は元の設定(enabled なら起動する)に戻る
enable:次回 OS 起動時に自動起動する設定を入れる。今すぐは起動しない
disable:次回 OS 起動時に自動起動しない設定を入れる。今すぐは停止しない

新規にサーバーへサービスをインストールしたときは `sudo systemctl enable --now サービス名` の一行で「今すぐ起動かつ次回から自動起動」を同時に設定するのが実務での定番です。

応用・実務 Tips

1. 設定ファイル変更後にデーモンをリロードする

ユニットファイル(/usr/lib/systemd/system/*.service)を直接編集した場合や、systemctl edit で上書き設定を行った場合は、systemd 自身に変更を読み込ませる必要があります。

# ユニットファイルを編集・追加した後は必ず実行する $ sudo systemctl daemon-reload

daemon-reload を忘れると、新しいユニットファイルが認識されなかったり、古い設定でサービスが起動したりするトラブルが発生します。

2. 依存関係を確認する

# あるサービスが依存するユニットを表示する $ systemctl list-dependencies httpd httpd.service * ├─-.mount * ├─system.slice * ├─systemd-journald.socket * └─basic.target * ├─microcode.service ... # 逆に、あるサービスに依存しているユニットを表示する $ systemctl list-dependencies --reverse httpd

3. ユニットファイルの内容を確認する

# ユニットファイルのパスと内容を表示する $ systemctl cat httpd # /usr/lib/systemd/system/httpd.service [Unit] Description=The Apache HTTP Server Wants=httpd-init.service After=network.target remote-fs.target nss-lookup.target httpd-init.service Documentation=man:httpd.service(8) [Service] Type=notify Environment=LANG=C ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ... [Install] WantedBy=multi-user.target

4. マスクでサービスを完全に無効化する

disable は自動起動を無効にするだけで、手動での start は可能です。別のサービスから依存起動される場合も含めて完全に無効化するには mask を使います。

# サービスをマスク(完全無効化)する $ sudo systemctl mask httpd Created symlink /etc/systemd/system/httpd.service → /dev/null. # マスクを解除する $ sudo systemctl unmask httpd Removed /etc/systemd/system/httpd.service.

mask は /etc/systemd/system/httpd.service を /dev/null へのシンボリックリンクにすることで起動を不可能にします。セキュリティ要件で特定のサービスを絶対に起動させたくない場合に使います。Apache の設定全般についてはこちらも参考にしてください。

トラブルシュート・エラー対処

「Failed to start」エラーが出た時の対処法

$ sudo systemctl start httpd Job for httpd.service failed because the control process exited with error code. See "journalctl -xe" for details.

このエラーが出た場合の確認手順は以下の通りです。

# ステップ1: サービスのログを確認する(最近のエラーを表示) $ sudo journalctl -u httpd --since "10 minutes ago" May 02 10:15:33 web01.example.com httpd[8142]: httpd: Syntax error on line 56 of /etc/httpd/conf/httpd.conf: May 02 10:15:33 web01.example.com httpd[8142]: Invalid command 'Servre', perhaps misspelled # ステップ2: 設定ファイルの構文チェックを実行する $ sudo httpd -t Syntax error on line 56 of /etc/httpd/conf/httpd.conf: Invalid command 'Servre', perhaps misspelled # ステップ3: 設定ファイルを修正した後に再起動する $ sudo systemctl start httpd

systemd-analyze コマンドで起動時間を計測することで、サービスの起動タイミング問題も特定できます。

「Unit not found」エラーが出た時の対処法

$ sudo systemctl status httpd Unit httpd.service could not be found. # パッケージがインストールされているか確認する(RHEL系) $ rpm -qa | grep httpd # 何も表示されない場合はインストールが必要 # パッケージをインストールする $ sudo dnf install httpd # インストール後にユニットファイルが認識されているか確認する $ systemctl list-unit-files | grep httpd httpd.service disabled disabled

本記事のまとめ

systemctl の主要操作を一覧にまとめます。
やりたいこと コマンド
サービスを今すぐ起動する sudo systemctl start サービス名
サービスを今すぐ停止する sudo systemctl stop サービス名
サービスを再起動する sudo systemctl restart サービス名
設定ファイルだけ再読み込みする sudo systemctl reload サービス名
サービスの状態を確認する systemctl status サービス名
自動起動を有効にする sudo systemctl enable サービス名
自動起動を無効にする sudo systemctl disable サービス名
起動+自動起動を同時に設定する sudo systemctl enable --now サービス名
自動起動の設定を確認する systemctl is-enabled サービス名
全サービスの一覧を表示する systemctl list-units --type=service
ユニットファイルを更新後に反映する sudo systemctl daemon-reload
サービスを完全に無効化する sudo systemctl mask サービス名
start と enable の違いを押さえておくだけで、「再起動後に止まっていた」「なぜか自動起動しない」というトラブルの大半は防げます。セミナーでも必ず最初に説明するポイントで、受講生のつまずきが最も多い箇所のひとつです。systemd の基本を押さえたら、Linux のポート確認コマンドの使い方もあわせて確認することをお勧めします。

systemctl の操作、コマンドを知っているだけでは現場では通用しません

start と enable の違いを知っていても、「どのタイミングで何を確認するか」という判断軸がなければ障害対応では動けません。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。