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で停止または開始するサービスを定義します。たとえば、systemdmulti-user.targetのネットワーク・サービスを起動し、X Windowシステムはgraphical.targetを開始しますが、どちらのサービスもrescue.targetで停止します。

次の表では、Oracle Linux 6実行レベルとの互換性が必要な、一般的に使用されるシステム状態ターゲットとその同等の実行レベル・ターゲットについて説明しています。

表2-1 システム状態ターゲットおよび等価実行レベル・ターゲット

システム状態ターゲット 等価実行レベル・ターゲット 説明

graphical.target

runlevel5.target

ネットワーキングおよびディスプレイ・マネージャを使用して、マルチユーザー・システムを設定します。

multi-user.target

runlevel2.target

runlevel3.target

runlevel4.target

ネットワーキングを使用して非グラフィック・マルチユーザー・システムを設定します。

poweroff.target

runlevel0.target

システムを停止して電源をオフにします。

reboot.target

runlevel6.target

システムを停止して再起動します。

rescue.target

runlevel1.target

レスキュー・シェルを設定します。

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サービス・マネージャは、サービスに対するdisableenablereloadrestartstartstatus、および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.slicemymon.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の構成を変更する場合、servicetargetmountsocket、または/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)マニュアル・ページを参照してください。