screen上のMinecraftサーバーに時報をつける
- 前提
- screenとは
- screen内の標準入力にテキストを送る
- 時刻テキストを作る
- crontabに登録して、定期実行する
前提
- OS: Ubuntu 20.04
- Minecraft サーバーのバージョン:Java 1.16.5
(※今回使うMineraftコマンドはsay
なので、バージョンはあまり関係ない) - MinecraftサーバーがGNU screen上で動いていて、パスワード保護されていないscreen セッションであること
- cronが動いていること
screenとは
Screenとは、複数プロセスの端末を多重化するウインドウマネージャ
(man page より、筆者日本語訳)です。
ウインドウマネージャと言っても、GUIのウインドウを管理するソフトウェアではなく、CUIの画面を管理するソフトウェアです。
GNU Screenの管理する仮想端末は、DEC VT100の機能といくつかのANSIの管理機能を提供します。
screen内の標準入力にテキストを送る
試作として、screen内の標準入力にテキストを送ってみましょう。screenは、コマンドのオプションに「-X
」を使うことで
動作中のscreen セッションに対して命令を送ることができます。man pageを見ると、複数のscreen セッションがあるときは、-S
オプションで実行先を指定せよ、と書いています
また、パスワード保護されたscreen セッションでは動作しないとも書いてありますね。これが、前提条件で出てきた話です。
さて、実際のサンプルコードを見せましょう。コード1を見てください。
Screenのオプション-X
の後ろのeval
は、続くコマンドを評価する、Screenの内部コマンドです。
そしてさらに後ろにつづくstuff
は、文字列の引数を一つ取り、入力バッファに文字列を置く、Screenの内部コマンドです。
これがうまくいくと、screen セッション「sample」に、「test message (改行)」が送られます。
ここまで書いたらお気づきでしょうか?そう、Minecraftサーバーが動いているscreen セッションに対して、 「say 今は○○時○○分です (改行)」とか送れば、時報メッセージがMinecraftサーバーに流れるわけです!
時刻テキストを作る
では、時間を表示するテキストを作っていきましょう。…おっと?そのテキストは実行した時間によって変わりますね?
ここで、date
というコマンドを使います。dateコマンドは、システムの時間や日付を、表示したり変更したりするコマンドです。
さまざまな書式で現在時刻を表示できますが、今回は「%R
」(24時間表記の時と分)という形式を選ぶことにします。
コード2を見てください。
コード2は、bashの、コマンドを実行した結果をテキスト的に代入する機能を用いて、動的に現在時刻の文字列を生成しています。
crontabに登録して、定期実行する
crontab
は、cron daemonの扱うcron tableのファイル「crontab」をユーザー個別にメンテナンスするコマンドです。
crontab -e
で編集することができます。私の場合、ホームディレクトリ直下にbinフォルダを作り、そこにmc_postTimeという
シェルスクリプトを作成しまして、crontabに以下のように登録しました。
何を表しているかを読み解くと、「毎時0分と30分に、 ~/bin/mc_postTime
コマンドを実行する」です。
参考文献
- screen オンラインマニュアル(
man screen
で表示されるもの) - date オンラインマニュアル(
man date
で表示されるもの) - crontab オンラインマニュアル(
man crontab
で表示されるもの)