いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.250 / 読者数:2473名

こんばんは、うすだです。

ノートPC+Ubuntu13.04をメインに使っているのですが、最近、 サスペンドから復帰すると、動作しなくなる現象が多発しています。

具体的には、復帰に失敗するのでなく、復帰後、少し経ってから、 強烈に重たい状態になり、運が悪いとそのまま固まってしまうという現象です。

重たくなる直接の原因は、 「kworker」というカーネルスレッドが超絶な勢いで動き出すからなのですが、 kworker が何をやっているのかは、全然わかっていません。 (ザ・不勉強、というやつです。)

以前は、ときどき固まる程度だったのですが、ここ数週間で、 その頻度が急激に上がり、電源ボタン押下による強制再起動を強いられています。

いい加減つらくなってきましたので、ダメもとで、 カーネルのバージョンを上げてみました。

Index of /~kernel-ppa/mainline
http://kernel.ubuntu.com/~kernel-ppa/mainline/

「rc」がついていない最新っぽいやつ(3.11.6)にしたところ、 いままでが幻だったのではと疑いたくなるくらい、現象が起きなくなりました。
復帰後に kworker が暴れ出さず、非常に快適です。パラダイスです。

ただ、バージョンをあげたら解消された、で終わりにしていては、 技術者としてダメな気がします。いつの日か、現象を理解したいと思います。

いつかやる≒いつまでもやらない、といういままでの実績には蓋をして、 今回もはりきってまいりたいと思います。

今回のお題 - アラートの通知手段をいくつか試す (レベル:概ね初級)

いまさら言うのも気がひけますが、システムの異常をいち早く察知して、 問題が大きくなる前、あわよくば問題が発生する前に対処できると、 管理者として冥利につきる、と言えるのではないかと思います。

異常の検出は、いつも手動で行うわけにはいきませんので、 ある程度自動のチェックを仕込んでおく必要があります。

そして、自動のチェックで怪しい気配が感じられたとき、状況をいち早く知りたい! 知らなければならない!! 知らせろ!!! と思いますよね。

当メルマガでは、だいたいにおいて、メールでの通知で済ませてきましたが、 他の手段も少し考えてみました。
メール通知の方法も合わせて、ご覧いただけますと幸いです。

まずはメールから (sSMTP, mailx)

ちゃんとした社内などのサーバであれば、 Mail コマンドでメールの送信などが行えるようになっている…かもしれません。

そうでなければ、postfix や exim、sendmail などのMTA(Mail Transfer Agent) の設定を行う必要があります。

しかし、メールの送信だけ出来ればいい、という貴兄は、 送信だけに特化した「sSMTP」などを使うと、設定が簡単で済みます。

というわけで、以降では、sSMTPの設定をして、 Mailコマンドでメールの送信ができるまでの手順を、さらっとご紹介します。

 

まず、Mail コマンド自体がインストールされていないかもしれません。

  $ which Mail

を実行して、何も出力されなかったり、 知らないよ的なメッセージが出力される場合は、mailx や bsd-mailx、heirloom-mailx あたりのいずれかのパッケージをインストールしてください。

  # yum install mailx               (Fedoraなどの場合)
  $ sudo apt-get install bsd-mailx  (Ubuntuなどの場合)

 

次に、ssmtp パッケージをインストールします。

  # yum install ssmtp           (Fedoraなどの場合)
  $ sudo apt-get install ssmtp  (Ubuntuなどの場合)

Fedora などでは、 sendmail などのMTAがすでにインストールされている可能性があります。 「update-alternatives」コマンドを実行して、

  # update-alternatives --display mta

現在は sendmail.sendmail だよと言われたときは、 ssmtp に切り替える必要があります。
(ちなみに、Ubuntuの場合は、各所の mta を mailx にしてください。)

  # update-alternatives --config mta

 

さて、ssmtp の設定ファイルは、「/etc/ssmtp/ssmtp.conf」です。
例として、gmailのメールサーバを経由して送信するための、 最低限的な設定を以下に示します。

Mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
AuthUser=gmailのアカウント名
AuthPass=gmailのパスワード
AuthMethod=plain
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt  

3〜4行目には、 ご自身の gmail のアカウント名とパスワードを指定する必要があります。 生情報を記述するので、取り扱いにはご注意ください。

※ の行は、Fedora な方で、メール送信時に以下のエラーが出る場合に、 指定してください。(バグみたいです。そのうち直るかもしれません。)

  Cannot open smtp.gmail.com:587

ちなみに、ssmtp.conf が読めないと、Mailコマンドで送信できません。
Fedora では、/etc/ssmtp と /etc/ssmtp/ssmtp.conf が、 mail グループに属さないユーザでは読めないように設定されています。
ですが、sendmail(sendmail.ssmtp)コマンドには、 mailグループに対してセットグループIDが設定されているため、 sendmailコマンドからは読めるようになっています。ですので、 メールの送信はできます。

 

で、あとは、Mail コマンドで送信するだけです。

  $ uptime | Mail -s "result of uptime" あなたのメールアドレス

 

さらっと説明し過ぎましたが、実は、いろいろ過去に紹介済です。
細かいところを気にしなければ、いまでも問題ない内容だと思います。
よろしければご覧ください。

Vol.172 - sSMTP でメールを送信できるようにする
http://www.usupi.org/sysad/172.html
Vol.150 - alternatives でいろんなものを共存させる
http://www.usupi.org/sysad/150.html

デスクトップに通知する (notify-send, zenity, gxmessage, ...)

もしサーバにディスプレイがついていて、デスクトップな環境が動作するのであれば、 グラフィカルに通知するという手段もありだと思います。

Fedora や Ubuntu をお使いであれば、 「notify-send」や「zenity」などのコマンドが使えます。

 

notify-send は、通知領域にメッセージを表示するためのコマンドです。

  $ notify-send "$(uptime)"

「-u」オプションで緊迫度を指定できます。たとえば「critical」を指定すると、 Fedora では大げさに表示されます。

  $ notify-send -u critical まじやばいっす

 

zenity は、ダイアログを表示するためのコマンドです。
様々なダイアログを表示できます。たとえば、「--warning」オプションを指定すると、 警告ダイアログが表示されます。
(同様のオプションに、「--error」や「--info」があります。)

  $ zenity --warning --text=まじやばいっすよ

他にも、いろいろな使い方ができます。
(最後の例は、通知という目的からは外れていますが…。)

  $ ls -1 | zenity --list --column=files
  $ w | zenity --text-info
  $ for n in $(seq 0 20 100); do echo $n; sleep 1; done | \
    zenity --progress --auto-close

標準ではありませんが、「gxmessage」というコマンドもあります。
同名のパッケージをインストールすれば、使えます。zenity と同様に、 ウィンドウを表示してくれます。

  $ gxmessage -timeout 10 -nearmouse もうだめだ

zenity よりも、やや細かな指定ができるところが、やや利点です。
(上記は、-timeout 10 で10秒後に消滅、-nearmouse でマウスカーソルの近くに表示、 をオプションで指定しています。)

twitterでささやく (python-twitter)

やや脱線しますが、twitter でささやく、 というのも選択肢に挙げられるのではないかと思います。

もちろん、公なアカウントだとみんなに見られてしまう可能性がありますので、 非公開に設定された、専用のアカウントで試しましょう。

以下では、「python-twitter」を使ってささやく方法を、ご紹介します。
お察しの通り、Python スクリプトで実現します。
また、Fedora19 で確認しています。 Ubuntu13.04だとバージョンが古くて動作しませんでした。 13.10 だと大丈夫っぽいですが未確認です。

まず、python-twitter パッケージをインストールします。

  # yum install python-twitter

次に、以下のようなスクリプトを用意します。

#!/usr/bin/env python
import twitter
import sys

if (len(sys.argv) == 2):
    twapi = twitter.Api("Consumer keyの内容",
                        "Consumer secretの内容",
                        "Access tokenの内容",
                        "Access token secretの内容")
    twapi.PostUpdates(status=sys.argv[1])

引数が1つあるとき、その引数の文言をつぶやくだけのスクリプトです。
そうでないときは…特にエラーメッセージなど吐かずに終了します。
(ザ・手抜き、というやつです。…許してください。)

「Consumer key」「Consumer secret」「Access token」「Access token secret」は、 OAuth という認証に必要な情報です。ご存じな方はその情報を、 そうでない方は後述の取得手順を見て入手してください。
そして、またしても生の情報をそのまま書いています。取り扱いにご注意ください。 (あるいは、生じゃなくてよいように書き換えてください。)

で、例えば上記のファイル名が twupdate.py だとすると、 以下のように自分だけ実行できるようパーミッションを設定した後、 引数にメッセージを指定して実行します。

  $ chmod 700 twupdate.py
  $ ./twupdate.py "あかん もうあかん…"

 

ちなみに、Consumer key、Consumer secret、Access tokenおよび Access token secret の入手手順は、以下の通りです。

  1. https://dev.twitter.com/apps にアクセスしてサインイン
  2. 右上の「Create a new application」ボタンをクリック
  3. 名前(Name)、説明(Description)および WebSite を入力し、 Developer Rules Of The Road をよく読んで、Yes, I Agree にチェックしたり、 CAPTCHA を解釈して、よければ「Create your Twitter application」 ボタンをクリック
  4. Settings タブを開き、つぶやけるよう Read and Write にチェックを 入れて、「Update this Twitter application's settings」ボタンを クリック
  5. Details タブに戻り、「Create my access token」ボタンをクリック

すると、4つの情報が表示されるようになります。
これらをスクリプトに埋め込んで、ささやいてみてください。

おわりに

以上、アラートの通知手段を、いくつかご紹介しました。

できれば、SMS に通知とか、 GPIOを叩いてLEDを点けたり何かを鳴らすといったことをやりたかったのですが、 ハードも知識も不足していたため、 今回は断念しました。機会があれば、いつかご紹介したいと思います。

また、実際の例がほとんど載っていませんが、宿題の答えに、 超最小限な例を書きました。皆目わからないという迷える貴兄は、下記をどうぞ。

宿題の答え

前回の宿題は、

  ロードアベレージが閾値を越えたら警告を発するモノを作りましょう。

でした。

最終的なシェルスクリプトを、以下に示します。

#!/bin/sh
THRESHOLD=100 # ロードアベレージがこれ以上だと警告(100倍した値を設定してね)
AVG=$(uptime | awk '{print $(NF-2), $(NF-1), $NF}')
AVG1=$(echo $AVG | awk '{print $1}' | tr -d .,)
if [ "$AVG1" -ge $THRESHOLD ]; then
    echo "Load is high : $AVG"
fi

まず、uptimeコマンドの出力結果から、ロードアベレージを抜き出して、 変数AVG に格納しています。
ちなみに、その部分だけ実行すると、こうなります。

  $ uptime | awk '{print $(NF-2), $(NF-1), $NF}'
  0.31, 0.25, 0.20

それから、直近1分の平均を取り出し、カンマと小数点を取り除いたものを、 変数AVG1 に格納しています。
同様に、その部分だけを実行すると、こうなります。

  $ echo "0.31, 0.25, 0.20" | awk '{print $1}' | tr -d .,
  031

その値と、変数THRESHOLD の閾値と比較し、閾値以上なら、 echoコマンドで警告を出力します。
先ほど、小数点を取り除いた理由は、testコマンド([コマンド)が、 整数しか受け付けてくれないためです。

  $ [ 1.20 -ge 1.00 ]
  sh: 1: [: Illegal number: 1.20

幸い、先頭に 0 がついていても10進数だと思ってくださいます。
そして、uptimeコマンドが小数点第2位まで必ず表示してくれますので、 単純に . だけ取り除くという安直な処理で、今回はうまくいきます。

  $ [ 050 -ge 40 ] && echo high || echo low
  high

さて、このスクリプトを、たとえば checkload.sh という名前で作成したのなら、 いつものように実行可能にした後、実行してみてください。

  $ chmod +x checkload.sh
  $ ./checkload.sh
  $

…ロードアベレージが 1.00 以上でないと、何も出力されません。
どうしても出力を見たいという貴兄は、 THRESHOLD の値を 0 などに改竄して実行してみてください。 (後で、意味のある値に戻してください。)

  $ ./checkload.sh
  Load is high : 0.25, 0.25, 0.23

echoコマンドの代わりに、notify-sendコマンドを使えば、 デスクトップの通知領域に表示されます。echoコマンドの行を、 以下に差し替えてみてください。

  notify-send "Load is high : $AVG"

zenityコマンドでダイアログを出すと、ややうっとおしいでしょうか。

  zenity --warning --text="Load is high : $AVG"

結局、定番の、メールでの通知が、一番便利かもしれません。

  echo "Load is high : $AVG" | Mail -s "[warning] overload" root

その場合は、echoコマンドのまま、スクリプトの外でメール送信を行う方が、 汎用性があると思います。(ま、前述もすべてそうなんですが…。)

  $ ./checkload.sh | Mail -s "[warning] overload" root

今回の宿題

今回の宿題は、

  SSHのX11フォワーディングを使って、サーバから手元のデスクトップに
  通知を表示してみましょう。

です。

SSHには、ログイン先から、ログイン元のX Window Systemを利用できるという、 X11フォワーディングという機能があります。

これを使えば、手元のLinuxなデスクトップ環境に、 サーバの状態を通知することができそうです。というわけで、やってみましょう。

あとがき

あらためて言うのもなんですが、スマートフォン市場が拡大しています。

Q3スマートフォン市場、「Android」がシェア81%--Strategy Analytics調査 - CNET Japan
http://japan.cnet.com/marketers/news/35039316/

上記は、「Android OS」のシェア拡大に関する記事ですが、表には、 全体の出荷数などが載っています。それをみると、1年前では1.7億台だったのが、 今年は2.5億台と急増しています。(あ、四半期の数字です。)

かたや、PC市場は、マイナス成長が続いています。
1つ前の2Q13で約8,500万台です。1年前と比べると -11.4% だそうです。

PC市場シェアでLenovoがHPを抜き世界一に - PC Watch
http://pc.watch.impress.co.jp/docs/news/20130711_607308.html

上記には、今後はWindows XPのサポート終了で買い換え需要が… と書いてありましたが、アナログ放送終了前後のTV需要を思い出してしまい、 個人的には(PC業界にとって)あまり好ましくない状況のように感じました。

今はまだ、オフィスにPCが並んでいますが、 スマホやタブレットなどでも日常業務ができるようになったら、 PCでなくなる日が来るのでしょうか。

そんなとき、どんなサーバが、どこにあって、どんなサービスを提供しているのでしょう。

末端のシステム管理者だから関係ないや、ではなく、時代に乗り遅れないように、 でもなく、どのような未来がみんなにとって幸せなのか、 という視点で考えられたらなあ、と思っている次第です。

 

…よく考えたら、私、いまはシステム管理屋さんではありませんが…。
本業の方で、しっかり考えねばと思います。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、11月17日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 栗菓子の写真をいくつか撮りましたが、整理できてません。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本