在以服务形式启动的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
完成了,太好了。

在实施之前的实验
其实一开始,我按照以下方式写了脚本,但是什么都没有收到,然后就卡了很长时间。
#!/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
大丈夫吧。。。对吧???
与仅仅服务器相比,似乎并没有爆炸性增长,所以应该没什么大问题吧。