Linux講座にようこそ。このページは「Linuxの使い方 - 第7章 システム管理」です。

Linuxの使い方

7. システム管理(2/3)

7.2 プロセス管理(サービス)

UNIX系OSはマルチプロセスのOSですので、常に複数のプロセスが動いていて、それら個々のプロセスの動きの総体がOSの機能となります。つまり、実行しているプロセスの種類により、デスクトップPCになったり、サーバになったりするわけです。これらのプロセスは、デーモンプロセス或は、単にデーモンと呼ばれているものが多いのですが、これらは用が無いときは何もしないで、必要になったときに起動して作業をします。なお、最近はサービスという呼び方の方が一般的なようですので、この講座でもサービスと呼ぶことにします。

現在起動しているプロセスの表示と終了は、次のようなコマンドで行います。

※ 全プロセスの表示
$ ps -e
※ CPU消費の多いプロセスから順に表示
$ top
※ プロセスの終了
$ kill -SIGTERM プロセス番号

topコマンドは5秒(標準)間隔で状態を調べなおして、最新情報を表示することをくり返します。topコマンドを終了させるにはqサブコマンドを実行します。

killコマンドのSIGTERMはシグナルと呼ばれているもので、プロセスに送る信号です。プロセスを終了するときのシグナルのデフォルトはSIGTERMです。SIGTERMで終了できない場合はSIGKILL(強制終了)を試みるとよいでしょう。なお、シグナルの種類は-lオプションで表示できます。また、シグナルは数値でも指定できます。例えば、SIGTERMは15、SIGKILLは9になります。

プロセスの起動は明示的なもの(コマンドの実行やアイコンのクリックによる)と、暗黙的なもの(自動実行)が有ります。自動実行には次の2つが有ります。

7.2.1 OS起動による自動実行(systemctlコマンド)

OS起動時に自動的に起動するサービスの制御方法はディストリビューションにより異なります。従来は「SysVinit」によるサービスの制御方法が広く使われていましたが、Fedora 15からはsystemdと呼ぶシステムおよびサービスマネージャーに変更されました。systemdにはいろいろな機能があるのですが、ここではサービス管理についてのみ説明します。なお、SysVinitによるサービスの制御方法については【付録1. SysVinitによるサービスの制御(chkconfigとserviceコマンド)】をご覧ください。

systemdではソフトウェアパッケージにユニットファイルと呼ぶファイルが含まれており、このファイルに管理情報が記述されています。サービスに関するユニットファイルの拡張子は.serviceと決まっています。

httpd(Apache)等のサーバーソフトを追加インストールした場合、そのサービスは無効な状態になっていますので自動実行しません。自動実行したい場合は、サービス管理のためのGUIツールやsystemctlコマンドを使ってサービスを有効にします。また、サービスが無効な状態で起動することができますが、この場合はシステムを再起動しても自動実行はしません。

Systemd - KDEシステム設定
【図7-2】
Systemd - KDEシステム設定

デスクトップ環境の場合はGUIのサービス管理ツールがありますので、それらを使うこともできます。図7-2はKDEシステム設定ツールですが、このツールにサービス管理機能が含まれています。

systemctlコマンドにより、サービスの有効・無効・起動・停止・再起動・ステータスの表示等が行なえます。なお、ユニットファイル名の拡張子の.serviceは省略可能です。また、ステータスの表示やサービスの一覧表示等は一般ユーザの権限で実行できますが、サービスの有効・無効・起動・停止等のシステムの状態を変更するような作業を行う場合は管理者(rootユーザ)権限が必要です。

※ 有効・無効
# systemctl enable ユニットファイル名 ← 自動実行を有効にします
# systemctl disable ユニットファイル名 ← 自動実行を無効にします

※ 起動・停止・再起動
# systemctl start ユニットファイル名 ← サービスを起動します
# systemctl stop ユニットファイル名 ← サービスを停止します
# systemctl restart ユニットファイル名 ← サービスを再起動します
# systemctl try-restart ユニットファイル名 ← サービスが実行中のみ再起動します

※ ステータスの表示
$ systemctl status ユニットファイル名

※ 全サービスの一覧表示
$ systemctl list-unit-files --type service

systemctlコマンドの実行例を示します。httpdとmariadbのステータスを表示します。

$ systemctl status httpd.service ← httpdのステータスを表示します
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pr ← 自動実行は無効です
   Active: inactive (dead)
     Docs: man:httpd.service(8)
lines 1-4/4 (END) ← ここで、一時停止します。qを入力すると終了し、この行は消えます
$
$ systemctl status mariadb.service ← mariadbのステータスを表示します
● mariadb.service - MariaDB 10.1 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor ← 自動実行は無効です
   Active: inactive (dead)
lines 1-3/3 (END)
$

mariadbの起動とhttpdの有効化を行い、そのステータスを表示します。起動や有効化を行うには管理者権限が必要です。

# systemctl start mariadb.service ← mariadbを起動します
#
# systemctl status mariadb.service ← mariadbのステータスを表示します
● mariadb.service - MariaDB 10.1 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor 
   Active: active (running) since Thu 2017-07-27 09:04:28 JST; 13s ago
  Process: 2751 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, 
  Process: 2688 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mariadb.servic
  Process: 2666 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, st
 Main PID: 2723 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 26 (limit: 4915)
   CGroup: /system.slice/mariadb.service
           └─2723 /usr/libexec/mysqld --basedir=/usr

 7月 27 09:04:27 localhost.localdomain mysql-prepare-db-dir[2688]: Database M
 7月 27 09:04:27 localhost.localdomain mysql-prepare-db-dir[2688]: If this is
 7月 27 09:04:27 localhost.localdomain mysqld[2723]: 2017-07-27  9:04:27 1405
 7月 27 09:04:28 localhost.localdomain mysql-check-upgrade[2751]: The datadir
 7月 27 09:04:28 localhost.localdomain mysql-check-upgrade[2751]:   1. Back-u
 7月 27 09:04:28 localhost.localdomain mysql-check-upgrade[2751]:   2. Start 
 7月 27 09:04:28 localhost.localdomain mysql-check-upgrade[2751]:   3. Run 'm
 7月 27 09:04:28 localhost.localdomain mysql-check-upgrade[2751]: Read more a
 7月 27 09:04:28 localhost.localdomain mysql-check-upgrade[2751]: https://mar
 7月 27 09:04:28 localhost.localdomain systemd[1]: Started MariaDB 10.1 datab
#
# systemctl enable httpd.service ← httpdの自動実行を有効にします
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
#
# systemctl status httpd.service ← httpdのステータスを表示します
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor pre ← 自動実行は有効です
   Active: inactive (dead)
     Docs: man:httpd.service(8)
#

7.2.2 cronによる自動実行

システムにより、定期的に実行するように設定されているコマンドがあります。Fedoraの場合はanacronというサービスで行なっており、実際に実行されるコマンドは次のディレクトリに登録されているシェルスクリプトです。

/etc/cron.daily/
定期的に実行するコマンドを登録します。
/etc/cron.hourly/
定期的に実行するコマンドを登録します。
/etc/cron.monthly/
定期的に実行するコマンドを登録します。
/etc/cron.weekly/
定期的に実行するコマンドを登録します。

定期的に実行したい独自のコマンドがあった場合、上記ディレクトリにシェルスクリプトを追加しておくとよいでしょう。これが一番簡単なのですが、この方法では不都合な場合(一般ユーザが実行したい、等)はcronにより自動実行できます。cronはユーザー単位に実行するコマンド(ジョブ)を登録できます。

cronを使うにはcrontabコマンドで実行するジョブを登録します。crontabの形式は次の通りです。

$ crontab ファイルパス名 ← 実行するコマンドが記述されているファイルを指定します
$ crontab -rle ← -rはジョブの削除、-lはジョブの表示、-eはジョブの編集です

実行するコマンドは次の形式で指定します。コマンドの数が多いときや、型式が複雑な時はファイルに記述しておき、crontabコマンドでファイルの内容を登録することが出来ます。また、コマンドの数が少いような時はcrontabコマンドに「-e」オプションをつけるとviエディタを起動しますので、それで入力することもできます。その場合はファイル名の指定などは必要有りません。

分 時 日 月 曜日 コマンド
実行する時刻のを指定します。
実行する時刻のを指定します。
実行を指定します。
実行を指定します。
曜日
実行する曜日を指定します。日曜日は0、月曜日が1、・・・土曜日が6です。
コマンド
実行するコマンドを指定します。

日時には範囲を指定するための-(負記号)や、複数指定するための,(コンマ)や、全ての意味の*(アステリスク)などが記述できます。なお、コマンド実行時の環境変数は最小限のものしか設定されていないため注意が必要です。特に、シェルはBシェル(/bin/sh)ですし、PATHは「/usr/bin;/bin」のみです。これらを変更したい場合は先頭で設定しておきます。

ジョブの例を示しますが、この内容がcronfileファイルに記述してあるものとします。

PATH=/bin;/usr/bin;/sbin
1 12 * * 0 find /home/merry -name core -exec ls -ld {} > /tmp/core.log 2>&1 \; ← 毎週日曜日の12時1分にfindコマンドを実行します
2 12 * * 0 cp -R $HOME/DEVEL $HOME/BKUP ← 毎週日曜日の12時2分にcpコマンドを実行します
$ crontab cronfile ← ジョブを登録します
$
$ crontab -l ← 登録ジョブを表示します
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.2279 installed on Mon Jan 14 22:49:44 2002)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
PATH=/bin;/usr/bin;/sbin
1 12 * * 0 find /home/merry -name core -exec ls -ld {} > /tmp/core.log 2>&1 \;
2 12 * * 0 cp -R $HOME/DEVEL $HOME/BKUP
$
$ crontab -r ← ジョブを削除します
$