SadServers part1

本記事は(SadServers)[https://sadservers.com/]というlinuxサーバに関するトラブルシューティングを無料で練習可能なサイトを実施した記録です。
正解だけでなく、自分の回答過程やチップスを記録するためのものです

# TL;DR
\#1 - "Saint John": what is writing to this log file?
学べること
1. プロセスの特定
1. プロセスの停止

利用コマンド
- tail：ファイルの末尾を表示
- lsof：開いているファイルを表示
- fuser：ファイルやポートのプロセスを表示
- ps：実行中のプロセスを表示
- kill：プロセスにシグナルを送信


# 取り組み
## 問題の理解
>開発者が、ログ ファイル/var/log/bad.logに継続的に書き込み、ディスクをいっぱいにするテスト プログラムを作成しました。たとえば、 で確認できますtail -f /var/log/bad.log。
このプログラムは不要になりました。プログラムを見つけて終了してください。

考え方
1. 該当ファイルの中身を確認
1. 書き込みが行われているプロセスの特定
1. プロセスの停止
1. プロセス停止を確認

## 該当ファイルの中身確認
```terminal
admin@i-0b71e631086adadb0:~$ whoami 
admin
admin@i-0b71e631086adadb0:~$ tail -f /var/log/bad.log 
2025-03-23 08:58:21.096993 token: 1568857097

(省略)

2025-03-23 08:58:27.105986 token: 2137981625
^C
```
リアルタイムの書き込みを確認したいので、オプション```-f```を利用

## 書き込みを行っているプロセスを特定
- ```lsof```現在開かれているファイルを一覧表示。***どのプロセスがどのファイルを開いているかを調査***
- ```fuser```特定のファイルやポートを使用しているプロセスの PID を取得。***プロセスの特定と強制終了***

```terminal
admin@i-0b71e631086adadb0:~$ lsof /var/log/bad.log 
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
badlog.py 589 admin    3w   REG  259,1    23986 265802 /var/log/bad.log
admin@i-0b71e631086adadb0:~$ fuser /var/log/bad.log 
/var/log/bad.log:      589
admin@i-0b71e631086adadb0:~$ fuser -v /var/log/bad.log //-vは詳細表示
                     USER        PID ACCESS COMMAND
/var/log/bad.log:    admin       589 F.... badlog.py
```
PID689番のプロセスが該当ファイルへの書き込みを実施ていていることが判明

```terminal
admin@i-0b71e631086adadb0:~$ ps aux | grep 589
admin        589  0.0  1.7  12508  8240 ?        S    08:57   0:00 /usr/bin/python3 /home/admin/badlog.py
admin        843  0.0  0.1   5264   636 pts/1    S<+  09:01   0:00 grep 589
```
```ps```コマンドで特定したプロセスが書き込んでいること。その他のプロセスが書き込んでいないか念の為確認。
pythonでの書き込みが実施されている

## 該当プロセスの停止
```kill [シグナル] プロセスID（PID）```を利用
```
admin@i-0b71e631086adadb0:~$ kill 589
```

## プロセス停止を確認
```
admin@i-0b71e631086adadb0:~$ tail -f /var/log/bad.log 
2025-03-23 09:02:24.793731 token: 1268226744

(省略)

2025-03-23 09:02:27.498107 token: 182087225


^C
admin@i-0b71e631086adadb0:~$
```

# 公式のヒントと解答
>1. You can use ps to list all processes and see if you see something related, for example with: ps auxf. Ignore system processes [in brackets].
A better way is to use the command to list open files: lsof.

>2. Find the name (first column) and Process ID (PID, second column) of the process related to /var/log/bad.log by running lsof and filtering the rows to the one(s) containing bad.log.
You can also use the "fuser" command to quickly find the offending process: fuser /var/log/bad.log.

>3. Run: lsof |grep bad.log and get the PID (second column).
With the PID of the process, it's not necessary but we can find its current working directory (program location) by doing pwdx PID or for more detail: lsof -p PID and check the cwd row. This will allow us to check its ownership and perhaps inspect its offending code if it's a script (not a binary).
(Open window once more to see the complete solution).

>4. Solution: Using the PID found, terminate (kill) the process with kill -9 PID.

# Tips
```
tail [オプション] ファイル名
```
-n 数字 → 指定した行数を表示（例: tail -n 50 file.log）
-f → リアルタイムで更新を表示（例: tail -f /var/log/syslog）

```
lsof [オプション]
```
-i → 開いているネットワーク接続を表示（例: lsof -i :80）
+D ディレクトリ → 特定のディレクトリ配下のファイルを開いているプロセスを表示（例: lsof +D /var/log）

```
fuser [オプション] ファイルまたはポート
```
-v → 詳細なプロセス情報を表示（例: fuser -v /var/log/syslog）
-k → 対象のプロセスを強制終了（例: fuser -k /path/to/file）

```
ps [オプション]
```
aux → すべてのプロセスを詳細表示（例: ps aux）
-ef → 全プロセスをフルフォーマットで表示（例: ps -ef）

```
kill [シグナル] プロセスID（PID）
```
-9 (SIGKILL) → プロセスを強制終了（例: kill -9 1234）
-15 (SIGTERM) → 通常の終了要求（デフォルト）（例: kill -15 1234）