エンジニアとして仕事をしていると様々な仕事があります。要件定義、設計、開発、テスト、保守運用などなど。
自分は多くの工程に関わったことがあります。今回はその中から「保守運用」にターゲットを絞って記事を書きます。
保守運用と言っても非常に幅が広いです。その中から今回はLinuxで動くサーバーでの調査等の作業の際に使うコマンドを紹介します。
Linuxコマンドは非常に多くて覚えるのが大変だと思います。ですので今回は自分が実際に保守運用作業で使っていた代表的なコマンドを紹介します。
この記事を読めば、「こういう場合はこのコマンドを実行」という最低限の知識を得ることができるので是非参考にしてください。
最低限抑えておくべきLinuxコマンド
今回この記事で紹介するコマンドは以下です。
コマンド | 簡単な説明 |
---|---|
vi (vim) | テキストエディタ。Linux上でファイルを編集する時に使います。最初はviから始まって、その強化版がvimです。 |
view | viのRead Onlyバージョン。ファイル閲覧の時に使います。 |
less | ファイル閲覧の時に使います。非常に機能が豊富です。 |
top | プロセス、CPU、メモリの状態を確認するときに使います。 |
ps | 実行中のプロセスの一覧する時に使います。 |
df | ディスクの容量、使用率を調査する時に使います。 |
tail | ファイルの最終行から指定した行数を表示します。 |
では早速紹介に移ります。
vi (vim)
vi (vim)コマンドはファイルの編集の際に使います。Linux上で様々な定義が書かれたconfigファイルの修正や、シェルスクリプトを書いたりする場合に使うことが多いです。
viもvimもファイルのエディタであることには変わりありません。
ただviの場合は操作が少し特殊なので慣れないうちは使いこなすのに苦労します。初心者の場合はvimの方が使いやすいと思いますが、サーバー上にvimが入っていない場合もあると思うのでviの操作も覚えている方がいいと思います。
vi (vim)の基本的な操作は以下です。
終了 | :q | 保存せず終了。※修正を入れた場合は下にある:q!を使う必要があります。 |
:q! | 変更内容を保存せず終了。 | |
:w | 変更内容を保存。 | |
:wq | 変更内容を保存して終了。 | |
カーソルの移動 | h | 左(←)へ移動。 |
j | 上(↑)へ移動。 | |
k | 下(↓)へ移動。 | |
l | 右(→)へ移動。※エルです。 | |
gg | ファイルの先頭業へ移動。 | |
G (shift + g) | ファイルの最終行へ移動。 | |
検索 | / + 検索したい文字 | 前方検索。ファイルの先頭から最後に向かって順番に検索します。 |
? + 検索したい文字 | 後方検索。ファイルの最後から先頭に向かって順番に検索します。 | |
n | 次の検索候補へ移動。前方検索の場合は下に向かって、後方検索の場合は上に向かってカーソルが移動する。 | |
N (shift + n) | 1つ前の検索結果へ移動。前方検索の場合は上に向かって、後方検索の場合は下に向かってカーソルが移動する。 | |
モード | i | インサートモード。文字の入力が可能です。 |
: | コマンドモード。コマンドを入力することができます。コマンドとは上記の終了のためにキーを打ち込むことです。 |
大前提として上記にあげたのは保守運用で最低限知っておくべきことです。vi (vim)を使いこなすのであればもっと操作を知る必要があります。
最低限ここを抑えておくと困ることはないと思います。
ちなみにvimの場合は方向キーでカーソルの移動が可能です。ですが、hjklを使った操作を覚えておく方が色々をためになるとは思います。
view, less
view, lessは比較しながら説明をすると分かりやすいので比較しながら説明をします。
まずは2つの共通点から紹介します。
- ファイルの閲覧専用のコマンドです。
- viewは例外あり。
- 操作方法はvi (vim)と同じです。
- 検索、カーソル移動(方向キー使用可能)
- 複数ファイルの同時閲覧
- 正規表現で複数のファイルの同時閲覧が可能です。
続いて違いを紹介します。
項目 | view | less |
---|---|---|
コマンドの派生元 | vi | more |
編集 | 可能 ※インサートモードにして、:wq!で保存が可能 | 不可能 |
ファイル読み込み方式 | 全量読み込み | 最低限の読み込み |
読み込み速度 | 遅い(全量読み込みのため) | 早い(最低限の読み込みのため) |
スクロール可否 | 不可能 | 可能 |
終了コマンド | viと同じ ※:w!, :wq!のように最後に!をつけることで保存も可能 | q |
圧縮ファイルの閲覧 | 不可能 | 解凍なしで閲覧可能 |
リアルタイム更新 | 不可能 | 可能 |
違いはこんな感じです。自分が保守運用作業をするときはviewコマンドを使うことはほぼありませんでした。正直viewを使うべきって状況はないと思います。viewはviの閲覧専用のコマンドです。viでもvi -Rで実行したら閲覧モードになるのでほぼそれと同じです。ですのでviewを使うことはないと思っていただけたらと思います。
ということでここからはlessの最低限知っておくべき操作方法を紹介します。
※viewの操作はvi (vim)と同じという意味でも省略します。
終了 | :q | lessを終了します。 |
カーソルの移動 | g | ファイルの先頭業へ移動。コマンドの後ろに数字を入れるとその行に移動します。 |
G (shift + g) | ファイルの最終行へ移動。コマンドの後ろに数字を入れるとその行に移動します。 | |
検索 | / + 検索したい文字 | 前方検索。ファイルの先頭から最後に向かって順番に検索します。 |
? + 検索したい文字 | 後方検索。ファイルの最後から先頭に向かって順番に検索します。 | |
n | 次の検索候補へ移動。前方検索の場合は下に向かって、後方検索の場合は上に向かってカーソルが移動する。 | |
N (shift + n) | 1つ前の検索結果へ移動。前方検索の場合は上に向かって、後方検索の場合は下に向かってカーソルが移動する。 | |
リアルタイム更新 | F (shift + f) | ファイルの更新をリアルタイムで反映させます。ログを監視するときに頻繁に使います。 |
ctrl + c | リアルタイム更新の終了。 |
基本的な操作は上記に記載した通りです。これさえ覚えておくと困ることはないと思います。
lessの強みはリアルタイム更新ができることだと思います。調査のためにログを流し続けて目で確認するってこともやります。そのような時に非常に活躍します。
top
topコマンドはプロセス、CPU、メモリのリアルタイム監視の時に使います。
サーバー上でCPUやメモリの使用率が上がった時にどのプロセスが原因であるかを特定する際に活用します。
また負荷検証の際にtopでモニタリングしながら検証をすることがあるので、その際にも活躍します。
topコマンドで最低限覚えておくことは以下です。
top実行コマンド | top | CPU使用率の高い順番でプロセスを表示する。 |
top -n 数字 | プロセスの表示を指定回数分更新する。指定回数分更新されたら終了する。 | |
top -d 数字 | プロセスの更新頻度(秒)を指定秒数にする。 | |
top -a | メモリ使用率の高い順番でプロセスを表示する。 | |
top -p {PID} | 指定したPIDのプロセスを表示する。 | |
top実行中コマンド | q | プロセス表示を終了する。 |
P (shift + p) | CPU使用率でソートする(デフォルトがCPU使用率) | |
M (shift + m) | メモリ使用率でソートする。 | |
R (shift + r) | ソートの際の昇順/降順を切り替える。 | |
d + 数字 | プロセスの更新頻度(秒)を指定秒数にする。 |
topコマンドはデフォルトでは3秒おきにエンドレスで更新されます。環境によっては更新の際に一度表示が消えて再表示を繰り返す場合があるので、更新頻度が高いと人の目ではステータスを読み取ることができない可能性があるので、更新回数の指定や更新頻度の指定のオプションは覚えておいた方がいいです。
topコマンドはCPU使用率やメモリ使用量を調査する際に使用するためそれぞれソートの方法は覚えている方がいいと思います。
これらのコマンド操作を覚えていると最低限の調査は可能です。
topは実行したら様々な項目が表示されます。下記に各項目が何を表しているしているかを書いておくので調査の際は参考にしてください。
カラム名 | 表示内容 | 詳細 |
---|---|---|
PID | プロセスのID | プロセスのID。 |
USER | ユーザー | プロセスを実行しいているユーザー。 |
PR | 優先順位 | 優先順位 |
NI | 相対優先順位 | 相対的な優先度。基準は0。小さい数字(負の数字)になるほど優先度が高くなる。 |
VIRT | 仮想メモリ | スワップしたメモリも含めて確保された仮想メモリの全量。 |
RES | 物理メモリ | スワップしていない使用中の物理メモリ。 |
SHR | 共有メモリ | 他のプロセスと共有される可能性のあるメモリのサイズ。 |
S | 状態 | プロセスのステータス。※ステータスに関しては別途記載 |
%CPU | CPU使用率 | CPUの使用率。 |
%MEM | メモリ使用率 | メモリの使用率。 |
TIME+ | 実行時間。 | プロセスの実行時間。 |
COMMAND | コマンド | そのプロセスの実行コマンド。 |
プロセスのステータスに関しては下記の表を参考にしてください。
表示文字 | 状態(Status) |
---|---|
R | プロセス実行中、もしくは実行可能状態。 |
T | プロセス停止中。割り込み可能。 |
S | スリープ中。ユーザーからの入力や別の処理の完了を待っている。 |
D | プロセス停止中。割り込み不可能。 |
Z | ゾンビ化状態。 |
ps
psコマンドはプロセスの調査の際に使用します。
psコマンドを実行する時は基本ps -efで実行することが多いです。
ですのでpsコマンド実行時はps -efをおまじないのように覚えておけばいいと思います。
それぞれのオプションの意味は以下です。
e | 全てのプロセスを表示する。 |
f | 完全なフォーマットで表示する。 |
psコマンドを実行した際に表示される項目とその意味はtopコマンドと似ているものが多いです。
カラム名 | 表示内容 | 詳細 |
---|---|---|
PID | プロセスのID | プロセスのID。 |
USER | ユーザー | プロセスを実行しいているユーザー。 |
TTY | 制御端末名 | 制御端末名 |
VIRT | 仮想メモリ | スワップしたメモリも含めて確保された仮想メモリの全量。 |
RES | 物理メモリ | スワップしていない使用中の物理メモリ。 |
START | 実行開始時間 | プロセスが動き始めた時間。 |
STAT | 状態 | プロセスのステータス。※ステータスに関しては別途記載 |
%CPU | CPU使用率 | CPUの使用率。 |
%MEM | メモリ使用率 | メモリの使用率。 |
TIME+ | 実行時間。 | プロセスの実行時間。 |
COMMAND | コマンド | そのプロセスの実行コマンド。 |
STAT(ステータス)に関しては以下の情報が表示されます。topコマンドと同じですね。
表示文字 | 状態(Status) |
---|---|
R | プロセス実行中、もしくは実行可能状態。 |
T | プロセス停止中。割り込み可能。 |
S | スリープ中。ユーザーからの入力や別の処理の完了を待っている。 |
D | プロセス停止中。割り込み不可能。 |
Z | ゾンビ化状態。 |
psコマンドを使って表示された情報で注意すべきはCPU使用率です。psコマンドで表示する場合とtopコマンドで表示した場合によってCPU使用率の計算方法が異なっています。
topコマンドのCPU使用率は前回の更新から今までのCPU使用時間のパーセンテージを表示しています。
一方でpsコマンドのCPU使用率はプロセスの稼働中のトータルでのCPU使用率を表示したものになります。
これらの違いを一言で言うと、「CPU使用率を計算している頻度が違う」ということです。
それ故に、負荷検証などを実施する際は頻繁なCPU使用率の変化を知りたいと思うのでtopコマンドを使うべきです。そのため監視目的で実行する場合は基本topコマンドと思っていただけたらと思います。
df
dfコマンドはディスクの容量を確認する際に使います。
dfコマンドにもおまじないのようなオプションがあります。
それはdf -hです。意味は下記にある通りです。
df -h | 表示したディスク容量の単位をわかりやすいように変換して表示 |
df単体で実行した場合は容量はキロバイト単位で、しかもカンマ区切りなしで表示されます。それ故にメガ、ギガを超えるようなディスクが登場するとパッと見ただけでは容量がわかりにくかったりします。
ですが−hのオプションを使うことでキロバイト単位での表示を容量に応じてメガやギガのような適切な単位に変換して表示してくれます。
最近ではギガはもちろん、テラバイトやペタバイトの要領を確保しいているディスクも珍しくありません。
自分は実際にペタバイトの容量が確保されたディスクに出会ったことがあります。
(※初見のときはPってペタバイト?って疑問符がでました。笑)
dfコマンドを実行して表示される項目とその意味は下記にある通りです。
カラム名 | 説明 |
---|---|
FileSystem | どのディスクであるかの情報 |
Size | そのディスクに確保されている容量(デフォルトの単位はキロバイト) |
Used | ディスクを使用容量(デフォルトの単位はキロバイト) |
Available | ディスクの空き容量(デフォルトの単位はキロバイト) |
Use% | ディスクの使用率 |
Mounted on | マウントポイント |
シンプルにディスクの容量に関する情報が記載されています。
システムのログが大量に出力されてディスクを圧迫しそうになったときの調査、そのディスクがどの程度の容量に耐えることができるのかの調査など意外と活躍の場面はあるので是非覚えてください!
tail
tailコマンドはファイルの最終行から指定した行数を出力するコマンドです。デフォルトでは10行を表示します。
tailコマンドで頻繁に使うオプションには下記が挙げられます。
-n {数字} | 指定した行数分を表示する。デフォルト(オプションを付けない場合)は10行。 |
-f | ファイルの追記を監視する。※別途説明 |
-F | ファイルの追記を監視する。※別途説明 |
基本的にはこれくらいしかオプションは使いません。
tailで少しややこしいのが「f」と「F」の違いです。
どちらのオプションもファイルの追記を監視することには変わりがないのですが、ファイル監視の仕組みが異なります。仕組みを理解せずに使用すると継続的な監視ができていないなどの問題を引き起こす可能性があるので要注意です。
「f」と「F」の違いを簡単に表すと下記の通りです。
f | ファイル名が変更されても元々監視していたファイルを監視し続ける |
F | ファイル名が変更された場合はtailコマンドで指定したファイル名のファイルを開き直す |
どのような違いがあるのかを実際のシステムでよくあるパターンを使って具体的に説明します。
多くのシステムの場合はログを出力するログファイルはログローテートという仕組みを採用することが多いです。
基本的にはシステムが動き続ける限りはログは出力され続けます。ですがずっと同じファイルにログを出力し続けるとファイルの容量がいっぱいになって書き込みができなくなります。場合によってはサーバーのディスクの容量の限界に達してしまいログが出力できなくなってしまう可能性があります。
ログローテートはそのような事態を回避するためにログファイルが一定の容量に達したらそのファイルをリネームして、ログは別のファイルに書き出していく仕組みです。
ログローテートの具体的な例としては下記です。
システムAではログはsytem_a.logに出力されファイルの容量が1GBになるとログローテートするようになっているとします。
その場合システムはずっとsystem_a.logファイルにログを出力し、ログファイルが1GBに到達するとsystem_a.logをsystem_a.log.yyyymmddhhmmssにリネームします。そてしてシステムは新しくsystem_a.logを作成してsystem_a.logにログを出力し続けます。
多くの場合はリネームに加えてそのリネームされたファイルを一定の周期でサーバーの外のストレージに転送することでサーバーのディスク容量圧迫を回避するような仕組みも組み込んでいます。
話をtailに戻すと、監視しているファイルの名前が変わることはログローテートの仕組みが一般的にあるように珍しい話ではありません。
だからこそ「f」と「F」の理解と使い分けが必要になります。
上記の具体例を使うと、「f」を使った場合は元々のファイルを監視し続けるのでリネーム後のsystem_a.log.yyyymmddhhmmssを監視し続けます。つまりずっと監視しようとしても一定のタイミングからはtailの出力結果の更新が止まります。
一方で「F」を使った場合は、ファイルがリネームされると最初に指定したファイル開き直して監視するので、リネーム後もsystem_a.logを監視し続けます。ですのでシステムがログ出力をする場合はずっとtailの出力結果が更新され続けます。
ですのでtailを使って追記を監視をする場合は「f」と「F」の意味を理解して使わないと想定した監視ができないので、この機会にぜひ覚えてください。
ちなみにですが、tailコマンドの追記の監視はlessのShift + fで代用が可能です。lessの場合はファイルを指定して開くのでログローテートなどでファイルがリネームされると追従できなくなってしまうのが玉に瑕です。
ですので自分がよく実行するコマンドはtail -F | lessです。tailで出力した結果をlessで表示することでlessの検索機能などを使うことができます。-Fをつけることでログローテートによるファイルのリネームによる継続的な監視の停止の回避もすることができます。
まとめ
Linuxはコマンドが非常に豊富ですので全部覚えるのは非常にハードルが高いです。
ですので、まずは本記事で紹介した基本的なコマンドを覚えることで最低限の保守運用作業はできると思います。
たとえ自分で全部解決できなくてもこれらのコマンドを使って調査をし、その情報を詳しい人や責任者にエスカレーションをする。それができるかできないかだけでも個人の評価が変わってくると思いますし、障害発生時から原因特定と復旧までの時間短縮に大きく貢献できると思います。
みなさまの保守運用作業の役に立ちますと幸いです。
コメント