在以服务形式启动的Minecraft服务器上收到登录通知后,通过LINE接收

起因

    • 強くなりたいしVPS借りて遊ぶぞ!

 

    • せっかくVPS借りるしマイクラのサーバ立てたらみんな(1-4人)でマルチできるんじゃね?

 

    • マイクラのサーバをサービスで動かしたらいちいちSSHせずに接続できるな、Realms借りなくてもいいじゃん!

 

    • でもなんか勝手に使われるのもアレだし、第三者に入られても困るし、ログイン時ぐらいは通知を受け取れるようにしたい

 

    メールとかどうせ見ないしLineに通知するかー

环境

    • さくらのVPS 1GBプラン

 

    CentOS 7.6.1810

文件・规划

ログイン・ログアウトの通知をラインに飛ばす
→「〇〇 joined/left the game」のログが拾えればいい
→ grepコマンドでgameを含む行を抽出すればいける?

ログイン・ログアウトの都度、その場で情報が欲しい
→マイクラサーバのログ出力を受け取る別プロセスを、マイクラサーバと一緒に動かしたい
→サービス実行時のシェルスクリプトでパイプをうまく繋げてやる?

できるだけ簡単にしたい
→ シェルスクリプトで完結させたい+メモリ消費も異常に増大してないかは確認したい

Implement
实施

我的Minecraft服务器

参考上述的文章,并将Minecraft服务器运行为服务(感谢)。在Ubuntu14.04上启动MinecraftServer作为服务。

现在可以通过运行一个叫做run.sh的shell脚本来启动服务。将启动这个脚本的Minecraft服务器以服务名minecraft_server进行注册,可以进行启动、停止和状态检查。

我假设已经达到这种状态。

LINE通知

我已经创建了LINE机器人,并通过curl向机器人发送消息。
请参考以下的网站,完成开发者注册、创建频道、创建机器人和获取令牌的步骤。(感谢)
使用Google Apps Script创建推送消息的LINE机器人。

此外,我还编写了一个脚本,可以直接将接收到的字符串发送到消息中。以下是脚本的具体内容,请注意以下几点:

    • Access TokenとUser Idには自分のbotの値を入れてください

 

    • sleep 1sは短時間に連続して送信しないための待ち処理です。待ち時間は適宜値を変えて使用してください

 

    追記:文字列$strの出力を`${str:33}’としてやることで、ログの時刻などを削り内容のみが送られて来るようにできました
#!/bin/bash

while true
do
        read v
        if [ -z "$str" ]; then
                break
        fi
        curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {Access Token}' \
-d '{
    "to": "{User Id}",
    "messages":[
        {
            "type":"text",
            "text":"'"${str:33}"'"
        }
    ]
}'
sleep 1s
done

脚本

只需要进行以下更改,即可将包含“game”字符串的行发送到服务器:
只需将run.sh文件修改如下,就会把包含“game”字样的行发送出去。

#!/bin/bash

cd /home/minecraft/minecraft
java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui | grep game --line-buffered | ./send.sh

完成了,太好了。

スクリーンショット 2019-04-25 17.37.42.png

在实施之前的实验

其实一开始,我按照以下方式写了脚本,但是什么都没有收到,然后就卡了很长时间。

#!/bin/bash

cd /home/minecraft/minecraft
java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui | grep game | ./send.sh

为了调查原因,我编写了一个简单的脚本并进行了实验。

准备好

首先,我创建了以下这样的脚本。

#!/bin/bash 

echo hoge
echo fuga hoge
sleep 1s
echo fuga hogehogehoge 
echo pikopiko
echo piko fuga
sleep 1s
echo hogehoge
echo fugafuga
echo hogefuga
sleep 5s

执行 (shí

在准备完这个后,执行以下命令,每秒输出多行随机字符串,并在程序结束前等待大约5秒。

./test.sh | grep hoge

在这种情况下,只会显示包含“hoge”的行,并且在输出这些行时将显示包含“hoge”的行,同时也显示grep的结果。

然后,我将发送到线路的脚本连接在其后面。

./test.sh | grep hoge | ./send.sh

在结果中,只显示包含”hoge”的行,但是在test.sh脚本完成后(即在脚本末尾的sleep 5s等待后),开始发送行。

哈啊~。。。。

因为我没有进行调查,所以不清楚原因,但是当在grep命令后连接另一个脚本时,前一个程序直到结束才将grep的结果传递给后一个程序。

当我搜索时,直接找到了确切的文章(非常感谢)
不让grep的输出缓冲

所以,当加入”–line-buffered”选项后,问题得到解决。这或许是基本的操作吧。
由于可能会导致性能下降,所以需要注意连接时的内存状况等因素。

确认行动

出于谨慎起见,我们对包含日志通知脚本和不包含的情况下的内存消耗进行了比较。

如果同时启动了grep和send.sh

              total        used        free      shared  buff/cache   available
Mem:            991         858          73           0          59          23
Swap:          4095         192        3903

如果只启动服务器

              total        used        free      shared  buff/cache   available
Mem:            991         871          65           0          54          12
Swap:          4095         162        3933

大丈夫吧。。。对吧???
与仅仅服务器相比,似乎并没有爆炸性增长,所以应该没什么大问题吧。

广告
将在 10 秒后关闭
bannerAds