📝

SadServers解説 Easy No.1 「このログファイルに書き込んでいるのは何者ですか?」

に公開

https://ja.wikipedia.org/wiki/セントジョン_(ニューブランズウィック州)

問題概要

問題URL

https://sadservers.com/scenario/saint-john

シナリオ

このログファイルに書き込んでいるのは何者ですか?

問題詳細

開発者が作ったテスト用プログラムが、/var/log/bad.log に継続的に書き込んでいます。

継続的に書き込み続けているプログラムはもう不要なので見つけて停止してください。ただし、ログファイル自体は削除してはいけません。

解決判定

/var/log/bad.log のサイズが一定時間変化しなくなれば解決です。Check My Solution ボタンは /home/admin/agent/check.sh を実行しており、その内容は確認・実行できます。

問題解決の方針

【表示する】

この問題の目的は、/var/log/bad.log に書き込んでいるプロセスを特定して止めることです。

まず現象を観察し、次に原因プロセスを特定し、最後に本当に更新が止まったことを確認する流れで進めましょう。

具体的な解決の段取りを表示する
  1. 対象のログが実際に増え続けていることを確認する
  2. そのログファイルを開いているプロセスを特定する
  3. 特定したプロセスの実体を確認し、本当に停止対象か、停止してよいかを見極める
  4. 原因プロセスを停止し、ログの更新が止まったことを確認し、判定用スクリプトでも解決済みであることを確かめる

ヒント

オリジナルヒント

ヒント1

まずは、本当に /var/log/bad.log が増え続けているかを確認します。
見るポイントは、行が継続的に増えているかどうかです。

実行コマンド

tail -f でファイルの末尾を流し続けながら、行が次々と追加されているかどうかを見てみましょう。

$ tail -f /var/log/bad.log
2026-03-14 09:16:02.149044 token: 117295998
2026-03-14 09:16:02.449526 token: 1648762588
2026-03-14 09:16:02.749981 token: 1844665286
^C
ヒント2

ログが増え続けていると確認できたら、次は「そのファイルをどのプロセスが開いているか」を調べます。

実行コマンド

書き込んでいるのが誰なのかを調べましょう。lsof にファイルパスを渡すと、そのファイルを開いているプロセスの一覧が出てきます。

$ lsof /var/log/bad.log
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
badlog.py 596 admin    3w   REG  259,1     9071 265802 /var/log/bad.log

PIDの値は、もしかすると実行するたびに変わるかもしれません。

ヒント3

PID が分かりました。ただ、プロセス名だけでは正体は分かりません。すぐに止める前に、ps -fp <PID> で何が動いているのかを確認しておきましょう。

実行コマンド

ps -fp に PID を渡してみましょう。CMD 列に注目すると、実際に何が実行されているかがわかります。

$ ps -fp 596
UID          PID    PPID  C STIME TTY          TIME CMD
admin        596       1  0 13:16 ?        00:00:00 /usr/bin/python3 /home/admin/badlog.py

今回は /usr/bin/python3 /home/admin/badlog.py というコマンドが実行されていることが分かります。

【参考】
同じ系統の確認方法として、ps auxf で親子関係を含めて全体を見る寄り道も妥当です。
ただし今回は、対象ファイルが分かっているので PID を直接調べるほうが早いです。

ヒント4

原因プロセスが特定できたら、そのプロセスを停止します。

実行コマンド

通常の kill でプロセスを停止したあと、もう一度 lsof でファイルを開いているプロセスが残っていないかを確認します。
最後に check.sh を実行して、問題の判定条件を満たしているかを確かめます。

$ lsof /var/log/bad.log
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
badlog.py 596 admin    3w   REG  259,1     9071 265802 /var/log/bad.log
$ kill 596
$ lsof /var/log/bad.log
$ /home/admin/agent/check.sh
OK

SadServers公式ヒント(翻訳)

ヒント1

ps を使って全プロセスを一覧表示し、関連しそうなものがないか確認できます。たとえば ps auxf のように実行します。

ヒント2

fuser コマンドを使うと、問題の原因になっているプロセスをすばやく見つけることもできます。fuser /var/log/bad.log のように実行します。lsof も別の選択肢ですが、このケースではかなり遅いです。

ヒント3

解答としては、見つけた PID を使って、そのプロセスを kill -9 PID で終了します。たとえば kill -9 7 のように実行します。

参考

今回のように、異常なファイルが先に見えている場合は、「そのファイルを開いているプロセスを調べる」という流れを覚えておくと役立ちます。これはログ肥大化だけでなく、削除したはずのファイルが容量を解放しないケースなどにも応用できます。

 
「いきなり問題を解き始めても調べるばかりになってしまう…」 「やりたいことが分かっても、コマンドが分からない…」 という方は、下記の記事でLinuxのコマンドを復習してから、SadServersの問題に取り掛かってみてはいかがでしょうか。
https://zenn.dev/comf_nakamura/articles/linux_command

 

問題一覧はこちら

https://zenn.dev/comf_nakamura/articles/sadservers_sitemap

Discussion