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

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


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

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

先日、ThinkPad の HDD を換装しました。

もとの HDD は 160GB で、未練たらしく Vista を残したままにしてありました。 ですので、仮想環境がいくつかあると、かなり手狭でした。

さて、新しく買った HDD の容量は、500GB です。
もとの 160GB と比べると、約3倍です。3倍ですよ、3倍。

広大だなぁなんて思って気が緩んでしまい、 リカバリDVD を使って真っ先に Vista を入れてしまいました。
いままでに1度しか起動したことがない(しかも、その目的はリカバリDVDの作成でした) ので、使わない可能性が非常に高いのですが…。

ただ、Vista の領域が仮に 60GB とすると、自由に使える容量は、

  (500 - 60) / (160 - 60) = 4.4倍

と、全体で比較した約3倍よりも大幅に増えることになります。
4倍以上も大きくなったのか、と思うと、得した気分になりますね。

またしても自分を偽りながら、今回もはりきってまいりますよ!

今回のお題 - Upstart をもう少し使い込んでみる

前回、Upstart の概要と、簡単なお試し方法をご紹介しました。

Vol.188 - Upstart の動きを理解する
http://www.usupi.org/sysad/188.html

ですが、あまりにも入口付近で終わってしまいましたので、今回は、 もう少し踏み込んでみたいと思います。

まず前半では、ジョブの定義ファイルについて、もう少しご説明します。
そして後半では、使い方の例を示したいと思います。

ジョブの定義ファイルをもうちょっと

前回は、「start on」「stop on」「exec」と「script〜end script」について、 簡単にご説明しました。

もちろんこれだけではありませんし、説明しきれてもいないと思います。
ですので、引き続き定義ファイルに設定できる項目をご紹介します。

とはいえ、相変わらずさらっと流していきますので、 さらに詳しい情報はオンラインマニュアル(man 5 init とか man 5 events とか) を参照してくださいませ。

 

まずは、「respawn」です。
いにしえ?の /etc/inittab では、respawn を指定しておくと、 コマンドが終了すると繰り返し起動してくれました。
たとえば、inittab に以下の一文があると、getty が延々実行されます。

  1:2345:respawn:/sbin/getty 38400 tty1

Upstart のジョブの定義ファイルも、「respawn」と書いておくと、 指定したジョブの内容が繰り返し実行されます。
たとえば、Ubuntu の /etc/init/tty1.conf には以下が含まれますので、 同様に getty が延々実行されます。

  respawn
  exec /sbin/getty -8 38400 tty1

また、以下のように、インターバル時間(単位は秒です) 内に実行する回数の上限を設けることもできるそうです。
(…が、わたしが試すと、意図した通りに動作しませんでした…。)

  respawn limit 最大起動回数 インターバル時間

 

お次は、「pre-start」「post-start」「pre-stop」「post-stop」です。
それぞれ、ジョブを実行する前、実行した後、ジョブを停止する前、 停止した後のタイミングで実行したい処理を指定できます。

ただし、「pre-stop」は、initctl stop(もしくは stop)したときにだけ実行されます。 (ジョブがいつ停止するか、わかりませんので…。)

たとえば、以下の内容のファイルを、 たとえば /etc/init/prepost.conf (Fedora12 だと /etc/event.d/prepost) として作成します。

pre-start exec logger exec pre-start by pid $$
post-start exec logger exec post-start by pid $$
pre-stop exec logger exec pre-stop by pid $$
post-stop exec logger exec post-stop by pid $$
script
    logger exec job script by pid $$
    sleep 60  # ←ジョブが実行中となる秒数を適当に指定
end script

そして、以下の手順でジョブをスタートします。
(Fedora12 の場合は initctl から戻ってこないので、 最後に & をつけてバックグランドで実行してください。)

  # initctl start prepost   (あるいは start prepost)

すると、syslog に以下が出力されます。
まず pre-start が実行され、ジョブが実行された後、 post-start が実行されることがわかります。

  # tail /var/log/syslog  (Fedora だと /var/log/messages)
  ...
  Nov  6 21:08:58 host logger: exec pre-start by pid 895
  Nov  6 21:08:58 host logger: exec job script by pid 897
  Nov  6 21:08:58 host logger: exec post-start by pid 898

ここで、すかさずジョブを停止します。

  # initctl stop prepost   (あるいは stop prepost)

すると、syslog に以下が出力されます。
pre-stop が実行されてからジョブが停止され、 post-stop が実行されることがわかります。

  # tail /var/log/syslog  (Fedora だと /var/log/messages)
  ...
  Nov  6 21:09:09 host logger: exec pre-stop by pid 903
  Nov  6 21:09:09 host init: prepost main process (897) killed \
  by TERM signal
  Nov  6 21:09:09 host logger: exec post-stop by pid 904

また、ジョブを停止せずに放置しておき、ジョブが終了してから syslog を見ると、 以下のような出力が得られます。
ジョブが終了した後、post-stop だけ実行されることがわかります。

  # initctl status prepost   (あるいは status prepost)
  prepost stop/waiting
  # tail /var/log/syslog  (Fedora だと /var/log/messages)
  ...
  Nov  6 21:15:05 host logger: exec post-stop by pid 946

 

最後に、ふたたび「start on」「stop on」です。
イベントを指定すると、 そのイベントが発生した時にジョブが開始したり停止したりする、と前回ご紹介しました。

  start on 開始するためのイベント
  stop on 停止するためのイベント

前回の内容の超簡単な要約は、以下の通りです。

  • イベントを指定すると、そのイベントが発生したときにジョブが起動(あるいは停止)
  • 「started ジョブ名」で、指定したジョブが開始したら起動
  • 「stopped ジョブ名」で、指定したジョブが停止したら起動

ほかに、「starting ジョブ名」で、指定したジョブが開始する前に起動させることや、 「stopping ジョブ名」で、 指定したジョブが停止する前に停止させるといったことができます。

  start on starting ジョブ名
  stop on stopping ジョブ名

また、「and」や「or」でイベントを複数指定することもできます。

  start on イベント1 and イベント2 ...
  stop on イベント3 or イベント4 ...

さらに、環境変数による条件をつけることもできます。

  start on イベント 環境変数=値...
  stop on イベント 環境変数=値...

たとえば、以下の内容の、お試しジョブの定義ファイルがあるとします。

  start on breakfast STAPLE=rice
  exec logger I ate breakfast $STAPLE

すると、breakfast というイベントを発生させただけでは、ジョブは起動されず、 syslog には何も出力されません。

  # initctl emit breakfast

ですが、以下のようにイベントを発生させると、ジョブが起動されます。

  # initctl emit breakfast STAPLE=rice
  # tail /var/log/syslog  (Fedora だと /var/log/messages)
  ...
  Nov  6 23:00:42 host logger: I ate breakfast rice

上記のように、環境変数は、exec や script の中で参照できます。

 

ところで、定義ファイルになにか間違いがあると、以下のように言われるようになり、 小心な貴兄はドキッとされるかもしれません。

  # start ジョブ名
  start: Unknown job: ジョブ名

そんなときは、syslog を見ると、間違いの詳細がわかります。

  # tail /var/log/syslog (もしくは /var/log/messages)
  ...
  Nov  6 23:12:32 host init: /etc/init/foo.conf:11: Unterminated \
  block

この場合は、foo.conf の最後が end script になっていない (script が end script で閉じられていない)ため、エラーになっていました。

  ...
  script
      logger test by pid $$
      sleep 5
  end_script    # ←ここが間違い

なにか問題が起こったときは、まず syslog をチェックしてみるとよいと思います。

いくつか試してみます

説明ばかりではつまらないので、実際になにかしてみようと思います。

仮に、usoservd というデーモンを動かす定義ファイルについて、 考えてみたいと思います。

今まで通り、ランレベル2〜5 あたりで起動するようにするには、最小限的には、 以下のような内容になると思います。

start on runlevel [2345]
stop on runlevel [016]
expect fork  # 説明していませんがデーモンには必要です
exec /usr/sbin/usoservd

残念ながら、Fedora12 では、「expect fork」に対応していません。
これがなくても起動はしますが、停止しなくなってしまいますので、 念のため頭の片隅に記憶しておいてください。

もし usoservd がデーモンではなく、 終了したら繰り返し起動してほしいというだけの場合は、 以下のようにすればよいと思います。

start on runlevel [2345]
stop on runlevel [016]
respawn
exec /usr/sbin/usoservd

 

お次は、ネットワークが有効になったとき、 その旨をメールで通知させてみましょう。
…ああワンパターンですみません。しかも、今度は Ubuntu 限定です。

Ubuntu では、ネットワークが有効になると、 net-device-up という名のイベントが発生します。
その際、環境変数「IFACE」にインターフェース名が格納されますので、 たとえば、eth0 が有効になったときにだけメールを送信するには、 以下のような定義ファイルを作成しておけばよさそうです。

start on net-device-up IFACE=eth0
script
    LANG=C /sbin/ifconfig $IFACE | mail -s "$IFACE is up" root
end script

ネットワークマネージャなどで、現在有効な設定を再度選択すると、 上記ジョブが起動され、以下のようなメールが root 宛に送信されます。

  To: root@usupi.org
  From: root@usupi.org
  Subject: eth0 is up

  eth0    Link encap:Ethernet  HWaddr 00:12:34:56:78:9a  
          inet addr:192.168.1.211  Bcast:192.168.1.255  \
  Mask:255.255.255.0
          inet6 addr: fe80::212:34ff:fe56:789a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  ...

これと同じノリで、 Postfix などの設定ファイルを切り替えるようにするのもよいかもしれません。
…って、以前、ネットワークマネージャをネタにした際、 sSMTP の設定を切り替えていました。どっちでやるのがいいのでしょうかね…。

Vol.174 - NetworkManager をもう少し活用してみる
http://www.usupi.org/sysad/174.html

おわりに

以上、前回に引き続き、Upstart をご紹介しました。

触れる余地が少ないかもしれませんが、有用なもので試せなくても、 試すうちにそれとなくわかってくるのではないかと思います。
ですので、ちょこっとでも試してみてください。

また、ご紹介した以外にも、いろいろな設定の書き方があります。
気になる貴兄は、お使いのマシンの /etc/init 以下をご覧ください。
(Ubuntu の方がいろいろあって面白いように思います。)

宿題の答え

前回の宿題は、

  ジョブの依存関係がループしているとどうなるでしょうか?

でした。

それでは、ドキドキしながらやってみたいと思います。
loop1 と loop2 というジョブを定義して、どちらも、 もう一方のジョブが起動したら自分が起動するよう設定します。

まず、loop1 の定義ファイルの内容を示します。
(/etc/init/loop1.conf(もしくは /etc/event.d/loop1)で保存します。)

start on started loop2
script
    logger loop1 by pid $$
    sleep 2
end script

そして、loop2 の定義ファイルの内容を示します。
(/etc/init/loop2.conf(もしくは /etc/event.d/loop2)で保存します。)

start on started loop1
script
    logger loop2 by pid $$
    sleep 2
end script

定義ファイルができましたら、意を決して、loop1 を起動してみます。

  # initctl start loop1

すると…いずれも1回しか起動されませんでした。

  # tail /var/log/syslog (もしくは /var/log/messages)
  ...
  Nov  7 16:43:23 host logger: loop2 by pid 10830
  Nov  7 16:43:23 host logger: loop1 by pid 10829
  # initctl status loop1
  loop1 stop/waiting
  # initctl status loop2
  loop2 stop/waiting

loop2 を起動した場合も同様です。

  # initctl start loop2
  # tail /var/log/syslog (もしくは /var/log/messages)
  ...
  Nov  7 17:10:48 host logger: loop1 by pid 10939
  Nov  7 17:10:48 host logger: loop2 by pid 10938

ちなみに、started を starting に変更しても、ログの順番が変わるだけで、 1回しか起動されないことに変わりはありませんでした。

さらにちなみに、3つのジョブをループさせてみましたが、 同様に1回しか起動されませんでした。

というわけで、うっかりループさせても延々起動されることはありませんので、 安心して(?)設定できるのではないかと思います。

今回の宿題

今回の宿題は、

  Upstart のイベントは、なにを使って実現されているのでしょうか?

です。

Upstart について調べている際、 発生するイベントと起動されるジョブをトレースできたらいいのに…と思いました。
(できるのかもしれませんが、現時点ではわかっていません。)

すると、イベントイベントって気軽に言っているけど、そもそもなんなんだろう? …という疑問がふつふつと沸いてきたわけです。

次回までに、ちょちょいと調べてみたいと思います。

あとがき

先日、とうとう、iPod touch を買ってしまいました。
冒頭の HDD に続いて散財…いやいやいや、どちらも必要な買い物です!

とりあえず、GMail でメールの読み書きをしたり、 Dropbox でファイルの共有ができることを確認したり、 Firefox Home を入れて自分のページをみてみたりなど、 自分なりに満喫しようとしています。
(FaceTime は…相手がいないので試せていません…。(TεT))

問題は、iTunes が動作する PC が、まわりに見当たらないことです。
家の Windows マシンはすべて 2000 止まりですし、 このマシンの仮想な環境で動作するのも 2000 です。iTunes はびた一文動きません。

というわけで、うっかり入れてしまった Vista が、 ここにきて役に立ちそうな気配を漂わせています。
(それでも、いまのところは、初期設定以外で iTunes は使ってません。)

 

あとは、自分でアプリを作ってみたいので、 よめに新しい Mac を買わせようと思っています。 (いまは PowerPC(!) な iBook をお使いです。)

ですが、iPod touch を買いに行ったとき、ついでにあれこれ眺めていたところ、 よめは iPad がものすごく気に入ってしまい、 MacBook ではなく iPad を買ってしまいそうな勢いさえ感じられました。
それでは(わたしが)困りますので、必死で否定しておきました。

年内には買い替えそうですので、それまでに、 MacBook の魅力を調査して力説できるようにしておきたいと思います。

 

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

 

「いますぐ実践! 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/ (モバイル栗日記)


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本