プロセス管理:ps、top
タスクスケジューリング:crontab
プロセス管理の概念
プロセスとは、独自の仮想アドレス空間内で実行される独立したプログラムです。
プログラムとプロセスの違い:プログラムは静的なコマンドの集合であり、システムのリソースを消費しません。一方、プロセスは常に変化する動的なもので、システムのリソースを使用します。1つのプログラムから複数のプロセスを起動できます。ジョブは特定の順序で実行される一連のコマンドです。単純なコマンドでも、特にパイプやリダイレクションを使用する場合、複数のプロセスが関係することがあります。プロセスには以下の特徴があります:
- 動的性:プロセスの実質は、マルチプログラミングシステムにおけるプログラムの実行プロセスであり、プロセスは動的に生成され、動的に消滅します。
- 並行性:任意のプロセスは他のプロセスと並行して実行できます。
- 独立性:プロセスは独立して実行できる基本的単位であり、同時にシステムリソースの割り当てとスケジューリングの独立した単位でもあります。
- 非同期性:プロセス間の相互制約により、プロセスには実行の断続性があり、各プロセスは独立した予測不可能な速度で進行します。
- 構造的特徴:プロセスはプログラム、データ、プロセス制御ブロックの3部分で構成されます。
- 複数の異なるプロセスが同じプログラムを含むことができます:1つのプログラムは異なるデータセットで異なるプロセスを構成し、異なる結果を得ることができますが、実行中にプログラムは変化しません。
Linuxシステムには3種類のプロセスがあります:
- 対話型プロセス:シェルによって起動および制御されるプロセスで、フォアグラウンドまたはバックグラウンドで実行できます。
- バッチ処理プロセス:端末とは無関係に、指定された時刻に実行される一連のプロセスです。
- デーモンプロセス:システム起動時に起動し、crond、rsyslogd、namedなどの即座のOSタスクを実行します。
システムプロセス情報の確認
- psコマンド:構文:ps [オプション]
| オプション | 意味 |
|---|---|
| -A | すべてのプロセスを表示 |
| -N | 指定された条件を満たさないすべてのプロセスを選択 |
| -a | セッションレーダーと端末に関連付けられていないプロセスを除くすべてのプロセスを表示 |
| -d | すべてのプロセスを表示(セッションレーダーを除く) |
| -e | すべてのプロセスを表示 |
| T | 現在の端末のすべてのプロセスを表示 |
| a | すべてのW/ttyを含む、他のユーザーも含む |
| r | 実行中のプロセスのみを表示 |
| x | 制御されていないttysを処理 |
| -c | -lオプションに対して異なるスケジューリング情報を表示 |
| c | プロセスをリスト表示する際、各プロセスの実際のコマンド名を表示し、パス、パラメータ、常駐サービスの識別子を含まない |
| -C<コマンド名> | コマンド名でプロセスを表示 |
| -G<実際のユーザーGIDまたはグループ名> | 実際のグループGIDまたはグループ名でプロセスを表示 |
| -U<実際のユーザーUIDまたはユーザー名> | 実際のユーザーUIDまたはユーザー名でプロセスを表示 |
| -g<グループ名> | セッションまたは有効なグループ名でプロセスを選択表示 |
| -p<プロセスID> | プロセスIDでプロセスを表示 |
| -s<セッションID> | 指定されたセッションIDのプロセスを表示 |
| -t<端末> | 端末でプロセスを表示 |
| -u<有効なユーザーUIDまたはユーザー名> | 有効なユーザーUIDでプロセスを表示 |
| U<ユーザー名> | そのユーザーに属するプロセスを表示 |
| t<端末> | 端末でプロセスを表示 |
| -f | UID、PPID、C、STIMEフィールドを表示 |
| -jまたはj | ジョブ制御の形式でプロセスを表示 |
| s | プロセスシグナルの形式でプロセスを表示 |
| v | 仮想メモリ形式でプロセスを表示 |
| -lまたはl | 詳細な形式でプロセスを表示 |
| u | ユーザー向け形式でプロセスを表示 |
| p<プロセスID> | 指定されたプロセス番号のプロセスを表示。-pオプションと同じ効果だが、リスト形式のみが異なる |
| L | 出力フィールドの関連情報をリスト表示 |
| f | ASCII文字でツリー状の結果を表示し、プロセス間の相互関係を表現 |
| r | 実行を終了したプロセスのみを表示 |
| e | プロセスをリスト表示する際、各プロセスが使用する環境変数を表示 |
| -wまたはw | 出力を幅広い形式で表示 |
| -u | ユーザー形式で出力し、ユーザー名とプロセスの開始時間を表示 |
| -x | 制御端末なしのプロセスを表示 |
| -t<端末番号> | 指定された端末番号のプロセスを表示 |
| n | USERとWCHANフィールドを数字で表示 |
| h | 見出し列を表示しない |
| -H | プロセス間の相互関係を示すツリー構造を表示 |
| -mまたはm | プロセスの後にスレッドを表示 |
| -y | -lオプションと併用する場合、F(フラグ)出力フィールドを表示せず、RSSフィールドでADDRフィールドを置き換える |
例:cronデーモンプロセスが実行中かどうかを確認
[root@server ~]# ps -ef|grep cron
systemd+ 1234 1 0 05:30 ? 00:00:01 /usr/sbin/crond -n
admin 5678 5432 0 06:15 pts/1 00:00:00 grep --color=auto cron
制御端末なしのすべてのプロセスを表示し、ユーザー名とプロセスの開始時間を表示します。
[root@server ~]# ps -aux
tty2端末のプロセスを表示
[root@server ~]# ps -t tty2
PID TTY TIME CMD
8901 tty2 00:00:01 agetty
- topコマンド:現在実行中のプロセスとその重要な情報(メモリとCPU使用量を含む)を表示します。qキーでtopコマンドを終了できます。
構文:top [オプション]
| オプション | 意味 |
|---|---|
| -b | バッチ処理モードを使用 |
| -c | プロセスを一覧表示する際、各プロセスの完全なコマンドを表示(コマンド名、パス、パラメータなどを含む) |
| -d<間隔秒数> | プロセス実行状態の監視間隔を秒単位で設定。 |
| -i | アイドル状態またはZombieプロセスを無視 |
| -n<実行回数> | 監視情報の更新回数を設定 |
| -S | 累積時間モードを使用 |
| -u<ユーザー名または有効なユーザーUID> | 指定された有効なユーザーUIDまたはユーザー名に一致するプロセスのみを監視 |
| -p<プロセスPID> | 指定されたプロセスIDのプロセスのみを監視 |
| -U<ユーザー名またはユーザーUID> | 指定されたユーザーUIDまたはユーザー名に一致するプロセスのみを監視 |
例:adminユーザーのプロセスのみを表示
[root@server ~]# top -u admin
killコマンドでプロセスを終了
構文:kill [オプション] [プロセス番号]
| オプション | 意味 |
|---|---|
| -s<シグナル> | 送信するシグナルを指定 |
| -l | シグナル名のリストを表示(合計62個) |
例:プロセス番号1234のプロセスを強制終了
[root@server ~]# ps -ef|grep cron
systemd+ 1234 1 0 05:30 ? 00:00:01 /usr/sbin/crond -n
admin 5678 5432 0 06:15 pts/1 00:00:00 grep --color=auto cron
[root@server ~]# kill -9 1234
[root@server ~]# ps -ef|grep cron
admin 5678 5432 0 06:16 pts/1 00:00:00 grep --color=auto cron
タスクスケジューリング:特定の時刻に特定のジョブをトリガーするには、タスクスケジュールを作成して、そのジョブを定期的に実行する必要があります。cronを使用したタスクスケジュールは、/etc/crontabファイルを変更する方法とcrontabコマンドを使用する方法のどちらでも実現でき、結果は同じです。
- cron関連パッケージのインストール
[root@server ~]# yum -y install cronie
- crondサービスの制御 以下のコマンドでcrondサービスを起動します
[root@server ~]# systemctl start crond.service
以下のコマンドでシステム再起動時に自動的にcrondサービスを起動します
[root@server ~]# systemctl enable crond.service
[root@server ~]# systemctl is-enabled crond.service
enabled
- /etc/crontabファイルはcronのデフォルト設定ファイルで、内容は以下の通りです
[root@server ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
#で始まる行はコメントであり、処理されません。
先頭の3行はcronタスクの実行環境を設定する変数です。/etc/crontabファイルの各行は1つのタスクを表し、その形式は以下の通りです
分 時 日 月 曜日 ユーザー名 コマンド
| 項目 | 説明 |
|---|---|
| 分 | 分、0〜59の任意の整数 |
| 時 | 時、0〜23の任意の整数 |
| 日 | 日、1〜31の任意の整数(月が指定されている場合、その月の有効な日付である必要があります) |
| 月 | 月、1〜12の任意の整数(または月の英語略称Jan、Febなどを使用) |
| 曜日 | 曜日、0〜7の任意の整数(ここで0または7は日曜日を表します、または英語略称Sun、Monなどを使用) |
| ユーザー名 | コマンドを実行するユーザー |
| コマンド | 実行するコマンドまたは作成したスクリプト |
/etc/crontabファイルでは、以下の時間形式を使用できます
| 時間形式 | 説明 |
|---|---|
| * | すべての有効な値を表すために使用できます。例えば、月値のアスタリスクは、他の制約条件を満たした後、毎月そのコマンドを実行することを意味します |
| - | 整数の範囲を指定します。例えば1-4は整数1、2、3、4を意味します |
| , | カンマで区切られた一連の値を指定します。例えば3,4,6,8は、これら4つの指定された整数を示します |
| 間隔頻度を指定するために使用できます。範囲の後に/<整数>を追加すると、その範囲内で整数をスキップできます。例えば"0-59/2"は分フィールドで2分間隔の時間を定義するために使用できます。間隔頻度値はアスタリスクと一緒にも使用でき、"/3"の値は月フィールドで3ヶ月に1回タスクを実行することを意味します |
- /etc/crontabファイルの設定例 毎晩21:30に/backup/backup.shを実行
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
30 21 * * * root /backup/backup.sh
毎週土曜日と日曜日の1:20にfindコマンドを実行し、対応するファイルを検索
20 1 * * 6,0 root /usr/bin/find /tmp -name "*.tmp" -exec rm {} \;
- /etc/cron.dディレクトリ:/etc/cron.dディレクトリにファイルを作成することでも実現できます(このディレクトリのすべてのファイルは/etc/crontabファイルと同じ構文を使用します)。例:
[root@server ~]# ls /etc/cron.d
0hourly
[root@server ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
crontabコマンドを使用したタスクスケジューリングの実装
- crontabコマンドの概要 root以外のユーザーはcrontabコマンドを使用してcronタスクを設定できます。すべてのユーザー定義のcrontabは/var/spool/cronディレクトリに保存され、作成したユーザーの権限で実行されます。
- 特定のユーザーとしてcrontabエントリを追加するには
- そのユーザーとしてログインします
- 次にcrontab -eコマンドを入力し、そのユーザーのcrontabを編集します(このエディタはVISUALまたはEDITOR環境変数で指定されます。ファイル形式は/etc/crontabと同じです)
- 編集が成功して保存されると、そのファイルはユーザー名に基づいて/var/spool/cron/ファイルに保存されます。
- crondデーモンは毎分/etc/crontabファイル、/etc/cron.dディレクトリ、および/var/spool/cronディレクトリの変更を確認します。変更が見つかると、それらはメモリに読み込まれます。
- 構文:crontab [オプション] crontab [オプション] [ファイル]
| オプション | 意味 |
|---|---|
| -u<ユーザー名> | ユーザー名。自分のユーザー名でログインしている場合、このオプションは必要ありません |
| -e | ユーザーのcrontabを編集 |
| -l | ユーザーのcrontabの内容を一覧表示 |
| -r | ユーザーのcrontabを削除 |
| -i | ユーザーのcrontabを削除前に確認 |
- crontabの作成 例:user01ユーザーでシステムにログインし、crontabを作成
[root@server ~]# su - user01
[user01@server ~]$ date
Mon Aug 05 08:30:15 JST 2019
crontab -eコマンドを使用してviエディタを開き、編集が成功したら確認。rootユーザーに切り替えて確認(一般ユーザーはこのファイルを開く権限がありません)
[user01@server ~]$ su - root
Password:
Last login: Mon Aug 05 08:28:45 JST 2019 from 192.168.1.100 on pts/0
[root@server ~]# cat /var/spool/cron/user01
- crontabを編集する際、各エントリにコメントを追加すると、その機能、実行時間、そしてどのユーザーのジョブかを把握できます。
- crontabの一覧表示:rootユーザーとしてuser01のcrontabを一覧表示
[root@server ~]# crontab -u user01 -l
- crontabの削除:crontabを削除すると同時に、/var/spool/cronディレクトリ内の指定されたユーザーのファイルも削除されます
例:一般ユーザーuser01が自分のcrontabを削除
[user01@server ~]$ crontab -r
- 削失したcrontabファイルの復元(システムが自動的にバックアップした場所/var/spool/cron/user01を探す)
構文:crontab [ファイル] 例:user01でログインして削失したcrontabファイルを復元
[user01@server ~]$ crontab /home/user01/user01cron