ICTの水たまり

top > 雑記と実験(ブログ) > 10/31 screen上のMinecraftサーバーに時報をつける

screen上のMinecraftサーバーに時報をつける

前提

screenとは

Screenとは、複数プロセスの端末を多重化するウインドウマネージャ(man page より、筆者日本語訳)です。 ウインドウマネージャと言っても、GUIのウインドウを管理するソフトウェアではなく、CUIの画面を管理するソフトウェアです。 GNU Screenの管理する仮想端末は、DEC VT100の機能といくつかのANSIの管理機能を提供します。

screen内の標準入力にテキストを送る

試作として、screen内の標準入力にテキストを送ってみましょう。screenは、コマンドのオプションに「-X」を使うことで 動作中のscreen セッションに対して命令を送ることができます。man pageを見ると、複数のscreen セッションがあるときは、-Sオプションで実行先を指定せよ、と書いています また、パスワード保護されたscreen セッションでは動作しないとも書いてありますね。これが、前提条件で出てきた話です。

さて、実際のサンプルコードを見せましょう。コード1を見てください。

コード1: screen内の標準入力にテキストを送る
#!/bin/bash

# スクリプト実行時は、対象となるscreenセッションが動いていることを前提とする。
# $SCNAME は screen セッション名。ここではsampleとする。
# $message は本体のメッセージ。ここに書いたメッセージが送られます。
SCNAME=sample
message='test message'
screen -S $SCNAME -X eval "stuff '$message'\015"
exit 0

Screenのオプション-Xの後ろのeval は、続くコマンドを評価する、Screenの内部コマンドです。 そしてさらに後ろにつづくstuffは、文字列の引数を一つ取り、入力バッファに文字列を置く、Screenの内部コマンドです。 これがうまくいくと、screen セッション「sample」に、「test message (改行)」が送られます。

ここまで書いたらお気づきでしょうか?そう、Minecraftサーバーが動いているscreen セッションに対して、 「say 今は○○時○○分です (改行)」とか送れば、時報メッセージがMinecraftサーバーに流れるわけです!

時刻テキストを作る

では、時間を表示するテキストを作っていきましょう。…おっと?そのテキストは実行した時間によって変わりますね? ここで、dateというコマンドを使います。dateコマンドは、システムの時間や日付を、表示したり変更したりするコマンドです。 さまざまな書式で現在時刻を表示できますが、今回は「%R」(24時間表記の時と分)という形式を選ぶことにします。 コード2を見てください。

コード2: 現在時刻のメッセージをMinecraftサーバーに送る
#!/bin/bash
SCNAME=sample
screen -S $SCNAME -X eval "stuff 'say 現在時刻は $(date +%R) です'\015"

コード2は、bashの、コマンドを実行した結果をテキスト的に代入する機能を用いて、動的に現在時刻の文字列を生成しています。

crontabに登録して、定期実行する

crontabは、cron daemon(デーモン)の扱うcron tableのファイル「crontab」をユーザー個別にメンテナンスするコマンドです。 crontab -eで編集することができます。私の場合、ホームディレクトリ直下にbinフォルダを作り、そこにmc_postTimeという シェルスクリプトを作成しまして、crontabに以下のように登録しました。

コード3 crontabの登録
# (もともと入っていたコメントは略します。)

0,30 * * * * ~/bin/mc_postTime

何を表しているかを読み解くと、「毎時0分と30分に、 ~/bin/mc_postTimeコマンドを実行する」です。

参考文献

  1. screen オンラインマニュアル(man screenで表示されるもの)
  2. date オンラインマニュアル(man dateで表示されるもの)
  3. crontab オンラインマニュアル(man crontabで表示されるもの)

付録