コンピューターシステム株式会社

技術BLOG

LinuxとAIXのコマンド差分紹介

言語 2020/09/30 東京担当

こんにちは。東京本社のK.I.です。

今回は私がスクリプト作成時に参考にしたLinuxマシンとAIXマシンで差分があったコマンドを一部紹介します。

sarコマンド(マシン使用状況取得コマンド)

sarコマンドはLinuxマシンとAIXマシンで出力内容が異なります。

「sar 1 2」の実行結果(1秒おきに2回実行)は以下のようになります。

Linuxマシン

10時46分14秒 CPU %user %nice %system %iowait %steal %idle
10時46分15秒 all 7.81 0.00 9.57 0.00 0.00 82.62
10時46分16秒 all 1.50 0.00 2.51 0.00 0.00 95.99
平均値: all 4.65 0.00 6.03 0.00 0.00 89.32

出力の詳細は以下のとおりです。

%user ユーザレベル(アプリケーション)で実行中に発生した CPU 使用率
※仮想プロセッサの実行に費やされた時間は含まれない
%nice 優先順位の高い (nice 値が変更された) ユーザレベルで実行中に発生した CPU 使用率
%system システムレベル(カーネル)で実行中に発生した CPU 使用率
※ハードウェアおよびソフトウェア割り込みの処理に費やされた時間が含まれる
%iowait システムが未処理のディスク I/O リクエストを出している間に、
CPU がアイドル状態だった時間の割合 (I/O 待ちしている CPU 使用率)
%steal ハイパーバイザが別の仮想プロセッサ (ゲスト OS) を処理している間に、
1つまたは複数の仮想 CPU が待機するのに費やした時間の割合
%idle CPU がアイドル状態で、システムに未処理のディスク I/O リクエストがなかった時間の割合

AIXマシン

10:48:46 %usr %sys %wio %idle
10:48:47 2 5 1 92
10:48:48 2 1 0 97
平均 2 3 1 94

出力の詳細は以下のとおりです。

%usr プロセッサーが、 ユーザー (またはアプリケーション) レベルの実行に使用されていた時間の割合
%sys プロセッサーが、 システム (またはカーネル) レベルの実行に使用されていた時間の割合
%wio システム上に未解決のディスク/NFS 入出力要求が存在していた期間のうち、
プロセッサーがアイドル状態になっていた時間の割合
%idle プロセッサーが、 未解決のディスク入出力要求がなくアイドル状態になっていた時間の割合

違いは出力される要素数だけでなく、Linuxでは少数、AIXでは整数で結果が出力されます。

Linuxのシェルスクリプトでこれらの値を扱う場合はbcコマンドを忘れないようにしないといけません。

sarコマンドには複数のオプションが存在し、より詳細な内容を取得することも可能です。

また、sarコマンドと同じようにマシンの状況を把握するコマンドとしてvmstatコマンドやiostatコマンドがあります。


dateコマンド(日時取得コマンド)

日時取得するdateコマンドですが、LinuxとAIXで日時計算をする方法に差があります。

Linuxマシンでは以下のdateコマンドで10秒前の日時を取得できます。

※「ago」を削除すると10秒後の日時を取得できます

date --date "10 sec ago" '+%Y/%m/%d %H:%M:%S'

対してAIXマシンではdateコマンドでは日時計算はできません。

AIXマシンで上記のコマンドを実行するとオプションが存在しないというエラーとなります。

そのため以下のようなperl(シェルスクリプトで実行できる別言語)などを使用して日時計算をする必要があります。

perl -e '@T=localtime(time-\$ARGV[0]);printf("%d/%d/%d %d:%d:%d",($T[5] + 1900),$T[4]+1, $T[3], $T[2], $T[1], $T[0])' 10

上記コマンドはperlを実行するもので、内容を簡単に説明すると現在日時から$ARGV[0](上記コマンドの"10"の部分)の

秒数を引いた日時を算出し、指定した書式で出力します。


testコマンド(if文条件式)

if文の条件式に使用されるtestコマンドには複数のオプションが存在します。

以下のオプションでLinuxとAIXで違いがあったので紹介します。

・zオプション(文字列長が0のときtrue)

・nオプション(文字列長が0でないときtrue)

・eオプション(ファイルが存在するときtrue)

以下のシンプルなif文の結果を表にまとめました。

if [ -オプション 条件 ] ; then
echo "true"
else
echo "false"
fi
# 条件
Linuxマシン
AIXマシン
zオプション
nオプション
zオプション
nオプション
1
""
(ダブルクォーテーションのみ)
true
false
true
false
2
(半角スペースのみ)
true
true
false
(エラー)
false
(エラー)
3
" "
(半角スペース)
false
true
false
true
4
xxx
(任意の文字列のみ)
false
true
false
true
5
"xxx"
(任意の文字列)
false
true
false
true
6
$XXX
(値が存在する変数のみ)
false
true
false
true
7
"$XXX"
(値が存在する変数)
false
true
false
true
8
$abc
(値が存在しない変数のみ)
true
true
false
(エラー)
false
(エラー)
9
"$abc"
(値が存在しない変数)
true
false
true
false

項番2と3、項番8と9の組み合わせに注目してください。これらの条件に値が存在しない場合に注意が必要です。

項番2と8のように""(ダブルクォーテーション)がない場合、項番3と9のような想定される結果が得られません。

オプションに関係なく、AIXではエラーが発生しfalseとなりますが、Linuxでは特にエラーにならずtrueとして

処理が実行されます。

eオプションについても同様に、Linuxで""(ダブルクォーテーション)を使用していないとtrueとなってしまいます。

※AIXで""(ダブルクォーテーション)を使用していない場合はfalse(エラー)となります。

eオプションを使用する際はファイルが存在する前提の処理が含まれるはずなので予期せぬエラーの原因にもなりかねません。

ただ""(ダブルクォーテーション)の有無だけの差ですが、思っている以上に影響がある内容です。

シェルスクリプトでもif文は多用するものなのでtestコマンドのオプションなど使い方には注意しましょう。


最後に

今回は3つのコマンドを紹介しましたが、あくまで私がシェルスクリプトを作成している際に気づいたものです。

同じコマンドを同じように実行できるLinuxとAIXですが""(ダブルクォーテーション)の有無で結果が異なるものがあるように

オプションや出力が違うものはまだ多くあるはずです。

仮にLinuxとAIXどちらでも使用できるようなシェルスクリプトを作成する場合は

コマンドを使えるかどうかだけでなくオプションなどの詳細までちゃんと確認するようにしましょう。