そらのうきぶくろ

Blog - Permalink

ぴよぼっと大暴走の裏側

うちのTwitterをフォローしている人は知っているかもしれないが、ぴよぼっとといううちのツイートをマルコフ連鎖で適当に繋いでツイートするだけのbotをもう何年も飼っている。
それが、よりによってうちが誕生日の日(9/4)に暴走した。

暴走の様子。およそ5分おきに激しく誕生日祝福リプライを送り続けている。自分宛で本当に良かった。

なぜ起こったのか?

ぴよぼっとには、誕生日祝福機能が搭載されている。
特定のコマンドで、誕生日を覚えさせることができるというものだ。
具体的にはぴよぼっとに対して以下の正規表現にマッチするリプライをすることで発動する。

/誕生日.*?([0-1]?[0-9])月([0-3]?[0-9])日/

要するに以下のようなリプライにはすべて反応する。
・私の誕生日は9月4日です。
・私のお誕生日って実は10月20日なんですよ。
・誕生日01月01日
・お前をバグらせてやる。誕生日は2月31日
一応、月の部分が12より大きい値だったり、日の部分が31より大きい値だったら無視するようにしているが、一番下のやつは変な挙動をしつつ実行されると思われる。すごく昔に作ったプログラムなので日付の妥当性をチェックしていないらしい。が、本題から外れるのでここでは無視する。

「誕生日を覚える」というのは、具体的には以下のようなことをしている。
・ぴよぼっと内のデータベースに「リプライをしてきたアカウント名」「次に誕生日が来る日付」を保存する
・誕生日を覚えた旨のリプライを返す
アカウント名はともかく、 「次に誕生日が来る日付」 とはなんぞやというのを軽く説明しておくと。
例えば誕生日が9/4の人が、2022/9/5にリプライを送ったとする。この場合、 「次に誕生日が来る日付」 は「2023/9/4」になる。
また、誕生日が9/4の人が、2022/9/1にリプライを送ったとする。この場合、 「次に誕生日が来る日付」 は「2022/9/4」になる。
こうしておくと実装上都合が良いので、こうしている。

誕生日を覚えただけでは、誕生日祝福機能にはならない。当然、誕生日になったら祝福するという処理も必要だ。
ぴよぼっとには当然それがあるのだが、今回問題になったのはその機能の一部が関係している。

ぴよぼっとは、5分おきに以下のような処理をまとめて行っている。
・リプライを確認する
・スケジュールを通知する
・誕生日を祝福する
・フォローバックをする
この中の「誕生日を祝福する」という機能だが、具体的には以下のような処理を行っている。
・ぴよぼっと内のデータベースを確認し、現在の日付が「次に誕生日が来る日付」以降になっているアカウントの一覧を取得する
・それらのアカウントに対して、誕生日祝福リプライをツイートする
・ツイートしたアカウントの 「次に誕生日が来る日付」 を1年増やす(重要)
重要と書いた部分が本当に重要で、こうしておけば一度誕生日を迎えたアカウントに対してツイートしたら、次にツイートするのは一年後になる。
……ここまで読んで、あっ、と思った人もいるのではないだろうか。
なぜぴよぼっと大暴走が起きたのかというと、この「日付を1年増やす処理」が失敗していたからだ

なぜ失敗していたのか?

結論から書くと、ぴよぼっとが配置されているディスク領域が満タンになっていたから

このことは、まず現状の「誕生日祝福が5分おきにされる」という現象に対して、ぴよぼっとから一時的に誕生日通知機能を削ることを試みようとして判明した。

WinSCPを使ってサーバにログインし、誕生日祝福機能を削ったソースコードで上書きをしようとしたところ、書き込みに失敗
念の為TeraTermでログインしたターミナルでコマンドを打って確認。

清々しいまでのUse:100%。
これを見た時点で、おそらくエラーログの類いが溜まり続けているんじゃないかと推測した。
あとはそのエラーログがどこに存在するのか調べなければならない。
そこで、こちらの記事の方法が便利だった。

AWS ec2でディスク容量を調べるlinuxコマンド。(ディレクトリーごとの容量)

これで、どこのディレクトリにゴミファイルが存在するのかを調べていき……意外なところに溜まっていることが判明した。

なんと、メールに関係するものだった。
メールを送るような機能はつけていないはずだが……調べているうちに、自分がつけていなくてもデフォルトでついていることが分かった。
以下の記事が参考になった。

cronのメール送信機能を停止しよう

要するに、ぴよぼっとが5分おきに実行されるたび、デフォルトでメールを送信する機能がついているのだが、メールの設定をしていないのでメールの送信は失敗扱いになっていて、メールの送信が失敗になるたびに失敗したことを特定のファイルに追記し続ける、ということが起きていたのだ。
その追記し続けられたファイルは膨大な容量となり、ついにディスク領域の全てを使い尽くした。これがぴよぼっと大暴走の真相である。

解決策は、メールの送信が失敗するたびに追記され続けるクソでかいファイルを削除する。これだけ。

再発を防ぐために

二度書くが、自分以外のアカウントにこんなことしたら洒落にならない。
なので、きちんと再発を防ぐように対策した。
といってもやることは一つだけ。上記記事を参考に、メールの送信をそもそも試みないように設定を修正した。
これでもう大丈夫。二度と逆らうなよ、ぴよぼっと。

プログラミング | 君はコメントしてもいいししなくても良い

ぴよぼっと大暴走の裏側へのコメント (0)

コメントを書く


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>