2 システム・サービスの操作
警告:
Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。
できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。
この章では、実行中のOracle Linuxシステムでシステム・プロセス、サービス、およびリソースを管理する方法について説明します。システムのsystemd
ターゲットの変更方法、およびターゲットで使用可能なサービスの構成方法についても説明します。
systemdサービス・マネージャについて
systemd
サービス・マネージャは、Oracle Linux 7のUpstart init
デーモンを置き換えますが、Oracle Linux 6のレガシー・サービス・スクリプトの下位互換性も提供します。systemd
サービス・マネージャは、init
デーモンに対して次の利点を提供します。
-
各サービスはソケットベースのアクティベーションとD-Busを使用して、可能なかぎり並行して開始されます。
-
デーモンは必要に応じて開始できます。
-
プロセスはコントロール・グループ(cgroups)を使用して追跡されます。
-
システム状態のスナップショット、およびスナップショットからのシステム状態のリストアがサポートされています。
-
マウント・ポイントは
systemd
ターゲットとして構成できます。
systemd
プロセスは、システムの起動後に最初に開始し、システムの停止時に実行している最後のプロセスです。systemd
は、ブートの最終段階を制御し、システムを使用できるように準備します。また、systemd
は、サービスを同時にロードすることによって、起動を高速化します。
systemd
を使用すると、サービス(name .service
)、ターゲット(name .target
)、デバイス(name .device
)、ファイルシステム・マウント・ポイント(name .mount
)、ソケット(name .socket
)など、システム上の様々なタイプのユニットを管理できます。
たとえば、次のコマンドは、システムに一時ファイル・システム(tmpfs
)を起動時に/tmp
にマウントするよう指示します。
sudo systemctl enable tmp.mount
システム状態ターゲットについて
systemd
サービス・マネージャは、特定の目的に必要なサービスのみを使用してシステムを起動できるシステム状態ターゲットを定義します。たとえば、その実行レベルではX Window Systemを実行しないため、サーバーをmulti-user.target
で実行するとより効率的です。root
がシステムを使用できる場合にのみ、rescue.target
で診断、バックアップおよびアップグレードを実行してください。実行レベルごとに、systemd
で停止または開始するサービスを定義します。たとえば、systemd
はmulti-user.target
のネットワーク・サービスを起動し、X Windowシステムはgraphical.target
を開始しますが、どちらのサービスもrescue.target
で停止します。
次の表では、Oracle Linux 6実行レベルとの互換性が必要な、一般的に使用されるシステム状態ターゲットとその同等の実行レベル・ターゲットについて説明しています。
表2-1 システム状態ターゲットおよび等価実行レベル・ターゲット
システム状態ターゲット | 等価実行レベル・ターゲット | 説明 |
---|---|---|
|
|
ネットワーキングおよびディスプレイ・マネージャを使用して、マルチユーザー・システムを設定します。 |
|
|
ネットワーキングを使用して非グラフィック・マルチユーザー・システムを設定します。 |
|
|
システムを停止して電源をオフにします。 |
|
|
システムを停止して再起動します。 |
|
|
レスキュー・シェルを設定します。 |
runlevel*
ターゲットはシンボリック・リンクとして実装されます。
Oracle Linux 6実行レベル2、3、4に最も近い等価systemd
ターゲットはmulti-user.target
です。
詳細は、systemd.target(5)
マニュアル・ページを参照してください。
デフォルトおよびアクティブなシステム状態ターゲットの表示
デフォルトのシステム状態ターゲットを表示するには、systemctl get-defaultコマンドを使用します。
sudo systemctl get-default
graphical.target
システムで現在アクティブなターゲットを表示するには、systemctl list-unitsコマンドを使用します。
sudo systemctl list-units --type target
UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network.target loaded active active Network nfs.target loaded active active Network File System Server paths.target loaded active active Paths remote-fs.target loaded active active Remote File Systems slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 17 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
前述のgraphical
ターゲットがアクティブなシステムの出力例は、このターゲットがネットワーキングとサウンドをサポートするために、network
およびsound
を含むその他の16のアクティブなターゲットに依存していることを示しています。
システム上のすべてのターゲットのステータスを表示するには、--allオプションを指定します。
sudo systemctl list-units --type target --all
UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes emergency.target loaded inactive dead Emergency Mode final.target loaded inactive dead Final Step getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded inactive dead Network is Online network.target loaded active active Network nfs.target loaded active active Network File System Server nss-lookup.target loaded inactive dead Host and Network Name Lookups nss-user-lookup.target loaded inactive dead User and Group Name Lookups paths.target loaded active active Paths remote-fs-pre.target loaded inactive dead Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rescue.target loaded inactive dead Rescue Mode shutdown.target loaded inactive dead Shutdown slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization syslog.target not-found inactive dead syslog.target time-sync.target loaded inactive dead System Time Synchronized timers.target loaded active active Timers umount.target loaded inactive dead Unmount All Filesystems LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 28 loaded units listed. To show all installed unit files use 'systemctl list-unit-files'.
詳細は、systemctl(1)
およびsystemd.target(5)
の各マニュアル・ページを参照してください。
デフォルトおよびアクティブなシステム状態ターゲットの変更
systemctl set-defaultコマンドを使用して、デフォルトのシステム状態ターゲットを変更します。
sudo systemctl set-default multi-user.target sudo rm '/etc/systemd/system/default.target' sudo ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'
ノート:
このコマンドはターゲットをデフォルト・ターゲットがリンクしているものに変更しますが、システムの状態は変更しません。
現在アクティブなシステム・ターゲットを変更するには、systemctl isolateコマンドを使用します。
sudo systemctl isolate multi-user.target
すべてのターゲットをリストすると、graphical
およびsound
ターゲットがアクティブでないことが示されます。
sudo systemctl list-units --type target --all
UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes emergency.target loaded inactive dead Emergency Mode final.target loaded inactive dead Final Step getty.target loaded active active Login Prompts graphical.target loaded inactive dead Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded inactive dead Network is Online network.target loaded active active Network nfs.target loaded active active Network File System Server nss-lookup.target loaded inactive dead Host and Network Name Lookups nss-user-lookup.target loaded inactive dead User and Group Name Lookups paths.target loaded active active Paths remote-fs-pre.target loaded inactive dead Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rescue.target loaded inactive dead Rescue Mode shutdown.target loaded inactive dead Shutdown slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded inactive dead Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization syslog.target not-found inactive dead syslog.target time-sync.target loaded inactive dead System Time Synchronized timers.target loaded active active Timers umount.target loaded inactive dead Unmount All Filesystems LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 28 loaded units listed. To show all installed unit files use 'systemctl list-unit-files'.
詳細は、systemctl(1)
マニュアル・ページを参照してください。
システムの停止、一時停止および再起動
次のリストは、システムの停止、再起動、または一時停止に使用されるsystemctlコマンドについて説明しています。
-
systemctl halt
: システムを停止します。 -
systemctl hibernate
: システムを休止します。 -
systemctl hybrid-sleep
: システムを休止状態にし、操作を中断します。 -
systemctl poweroff
: システムを停止し、電源をオフにします。 -
systemctl reboot
: システムを再起動します。 -
systemctl suspend
: システムを一時停止します。
詳細は、systemctl(1)
マニュアル・ページを参照してください。
サービスの開始と停止
サービスを開始するには、start引数を指定したsystemctlコマンドを使用します。
sudo systemctl start sshd
systemd
サービスとしてポートされていない/etc/init.d
ファイルのレガシー・スクリプトの場合、start引数を指定してスクリプトを直接実行できます。次に例を示します。
/etc/init.d/yum-cron start
サービスを停止するには、stop引数をsystemctlに使用します。
sudo systemctl stop sshd
ノート:
サービスの状態の変化は、システムが同じ状態である間のみ維持されます。サービスを停止した後、(システムを再起動するなどして)システム状態ターゲットが変化し、それがサービスを実行するように構成された状態への変化であった場合は、サービスが再起動します。同様に、サービスを開始しても、次の再起動後はサービスの開始を有効にしないでください。詳細は、サービスの有効化と無効化を参照してください。
systemctlサービス・マネージャは、サービスに対するdisable、enable、reload、restart、start、status、およびstopアクションをサポートします。その他のアクションの場合は、サービスがこれらのアクションのサポートを提供するスクリプトを実行するか、レガシー・スクリプトの場合は必要なアクション引数を指定して/etc/init.d
スクリプトを実行します。レガシー・スクリプトの場合、スクリプトへの引数を省略すると、次のように使用方法のメッセージが表示されます。
/etc/init.d/yum-cron
Usage: /etc/init.d/yum-cron {start|stop|status|restart|reload|force-reload|condrestart}
詳細は、systemctl(1)
マニュアル・ページを参照してください。
サービスの有効化と無効化
systemctlコマンドを使用して、たとえば次のように、システム起動時に最初からサービスを有効または無効にできます。
sudo systemctl enable httpd sudo ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
前のコマンドは、サービスを開始する最低レベルのシステム状態ターゲットへのシンボリック・リンクを作成することによって、サービスを有効にします。この例では、コマンドはmulti-user
ターゲットへのシンボリック・リンクhttpd.service
を作成します。
サービスを無効化すると、シンボリック・リンクが削除されます。次に例を示します。
sudo systemctl disable httpd sudo rm '/etc/systemd/system/multi-user.target.wants/httpd.service'
is-enabledサブコマンドを使用して、サービスが有効かどうかをチェックできます。
sudo systemctl is-enabled httpd
disabled
sudo systemctl is-enabled nfs
enabled
systemctl disableコマンドを実行した後とでも、ユーザー・アカウント、スクリプト、およびその他のプロセスによってサービスを開始または停止できます。それが適切な動作でない場合は、systemctl maskコマンドを使用してサービスを完全に無効にします。
sudo systemctl mask httpd
Created symlink from '/etc/systemd/system/multi-user.target.wants/httpd.service' to '/dev/null'
サービスを実行しようとすると、サービス参照が/dev/null
に変更されたため、ユニットがマスクされたことを示すエラー・メッセージが表示されます。
sudo systemctl start httpd
Failed to start httpd.service: Unit is masked.
サービス参照を一致するサービス・ユニット構成ファイルに再リンクするには、systemctl unmaskコマンドを使用します。
sudo systemctl unmask httpd
詳細は、systemctl(1)
マニュアル・ページを参照してください。
サービスのステータスの表示
is-activeサブコマンドを使用して、サービスが実行中(アクティブ)か、実行中でない(非アクティブ)かをチェックできます。
sudo systemctl is-active httpd
active
sudo systemctl is-active nfs
inactive
statusアクションを使用して、サービスを実装する制御グループ(cgroup)のすべてのタスクのツリーを含め、サービス・ステータスの詳細サマリを表示できます。
sudo systemctl status httpd
httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since Mon 2014-04-28 15:02:40 BST; 1s ago Main PID: 6452 (httpd) Status: "Processing requests..." CGroup: /system.slice/httpd.service ├─6452 /usr/sbin/httpd -DFOREGROUND ├─6453 /usr/sbin/httpd -DFOREGROUND ├─6454 /usr/sbin/httpd -DFOREGROUND ├─6455 /usr/sbin/httpd -DFOREGROUND ├─6456 /usr/sbin/httpd -DFOREGROUND └─6457 /usr/sbin/httpd -DFOREGROUND Apr 28 15:02:40 localhost.localdomain systemd[1]: Started The Apache HTTP Ser... Hint: Some lines were ellipsized, use -l to show in full.
cgroupは相互にバインドされているプロセスのコレクションであり、システム・リソースへのアクセスを制御できます。前の例では、httpd
サービスのcgroupはhttpd.service
であり、system
sliceにあります。
スライスはシステム上のcgroupsを複数のカテゴリに分割します。スライスとcgroup階層を表示するには、systemd-cglsコマンドを使用します。
sudo systemd-cgls
├─1 /usr/lib/systemd/systemd --system --deserialize 17 ├─user.slice │ ├─user-0.slice │ │ └─session-3.scope │ │ └─9313 /usr/sbin/anacron -s │ └─user-1000.slice │ └─session-5.scope │ ├─15980 sshd: root [priv] │ ├─15983 sshd: root@pts/1 │ ├─15984 -bash │ ├─17605 sudo systemd-cgls │ ├─17607 systemd-cgls │ └─17608 less └─system.slice ├─rngd.service │ └─1042 /sbin/rngd -f ├─irqbalance.service │ └─1067 /usr/sbin/irqbalance --foreground ├─libstoragemgmt.service │ └─1057 /usr/bin/lsmd -d ├─systemd-udevd.service │ └─24714 /usr/lib/systemd/systemd-udevd ├─polkit.service │ └─1064 /usr/lib/polkit-1/polkitd --no-debug ├─chronyd.service │ └─1078 /usr/sbin/chronyd ├─auditd.service │ └─1012 /sbin/auditd ├─tuned.service │ └─2405 /usr/bin/python2 -Es /usr/sbin/tuned -l -P ├─systemd-journald.service │ └─820 /usr/lib/systemd/systemd-journald ├─atd.service │ └─1824 /usr/sbin/atd -f ├─sshd.service
system.slice
にはサービスやその他のシステム・プロセスが含まれ、user.slice
には、scopesと呼ばれる一時cgroupで実行されるユーザー・プロセスが含まれます。この例では、ID 1000のユーザーのプロセスは、/user.slice/user-1000.slice
スライスのsession-5.scope
スコープで実行されています。
systemctlコマンドを使用して、サービスとスコープのcgroup内のプロセスで使用できるCPU、I/O、メモリー、およびその他リソースを制限できます。「システム・リソースへのアクセスの制御」を参照してください。
詳細は、systemctl(1)
およびsystemd-cgls(1)
の各マニュアル・ページを参照してください。
システム・リソースへのアクセスの制御
systemctlコマンドを使用して、システム・リソースへのcgroupのアクセスを制御します。
sudo systemctl set-property httpd.service CPUShares=512 MemoryLimit=1G
CPUShare
はCPUリソースへのアクセスを制御します。デフォルト値は1024であり、値を512にすると、cgroupのプロセスがアクセスできるCPU時間が半分になります。同様に、MemoryLimit
はcgroupが使用できるメモリーの最大量を制御します。
ノート:
.service
拡張子をサービス名に指定する必要はありません。
--runtimeオプションを指定すると、システムを再起動したときに設定が維持されません。
sudo systemctl --runtime set-property httpd CPUShares=512 MemoryLimit=1G
かわりに、サービスのリソース設定は、/usr/lib/systemd/system
のサービスの構成ファイルにある[Service]
の見出しで変更できます。ファイルの編集後、次の例に示すように、systemd
にその構成ファイルを再ロードしてから、サービスを再開するように指示します。
sudo systemctl daemon-reload
sudo systemctl restart service
スコープ内で一般的なコマンドを実行し、systemctlコマンドを使用して、これらの一時cgroupがシステム・リソースに対して持つアクセスを制御できます。
スコープ内でコマンドを実行するには、systemd-runコマンドを使用します。
sudo systemd-run --scope --unit=group_name [--slice=slice_name] command
デフォルトのsystem
スライスでグループを作成しない場合は、別のスライスまたは新しいスライスの名前を指定できます。
ノート:
--scopeオプションを指定しない場合は、制御グループがスコープではなく、サービスとして作成されます。
たとえば、mymonitorというコマンドをmyslice.slice
のmymon.scope
で実行します。
sudo systemd-run --scope --unit=mymon --slice=myslice mymonitor
Running as unit mymon.scope.
次に、systemctlコマンドを使用して、サービスと同じように、スコープがシステム・リソースに対して持つアクセスを制御します。ただし、サービスとは異なり、次のように.scope
拡張子を指定する必要があります。
sudo systemctl --runtime set-property mymon.scope CPUShares=256
詳細は、systemctl(1)
、systemd-cgls(1)
、およびsystemd.resource-control(5)
の各マニュアル・ページを参照してください。
systemd構成ファイルの変更
systemd
の構成を変更する場合、service
、target
、mount
、socket
、または/usr/lib/systemd/system
のその他のファイルを/etc/systemd/system
にコピーし、元のファイルからコピーしたものを編集します。/etc/systemd/system
のファイルのバージョンは、/usr/lib/systemd/system
のバージョンより優先され、/usr/lib/systemd/system
に関連するパッケージを更新しても上書きされないことに注意してください。ファイルの元のバージョンを使用するようにsystemd
を元に戻すには、/etc/systemd/system
のファイルの変更済コピーの名前を変更または削除します。
リモート・システムでのsystemctlの実行
sshd
サービスがリモートのOracle Linux 7システムで実行されている場合、次の例に示すように、systemctlで-Hオプションを使用してシステムをリモートから制御できます。
sudo systemctl -H root@10.0.0.2 status sshd
root@10.0.0.2's password: password
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since Fri 2014-05-23 09:27:22 BST; 5h 43min ago
Process: 1498 ExecStartPre=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
Main PID: 1524 (sshd)
CGroup: /system.slice/sshd.service
詳細は、systemctl(1)
マニュアル・ページを参照してください。