Mac標準コマンドでリソースモニタリング、ロギングのスクリプト例


20220429_log

# about  
- Macのリソースモニタリング、ロギングのスクリプト。
- 普段の作業前に起動して、終わったら止める。  
- 作業時と無風状態との比較対象として、放置してログ取ってみるなど。  

# commands
```
hostinfo
uptime
top -o mem -l 1
ps aux
vm_stat -c 86400 10
iostat 10
netstat 10
```

# log dir  
- Mac標準のコマンドで、10秒ごとに各種リソース、プロセスのログを書き出すスクリプト。  
- ログサイズは1分当たり1MBくらいなので、そこまで気にしなくて良いはず。  
- ログはグラフにするならエクセルなどで手動で。  
- ログは/tmp/配下に日付フォルダで。  
要らなくなったら削除を。  
/tmp/配下は時間経過か起動時かで消えるはずなので、消したく無いログは退避を。  


# steps  
1. デスクトップとか好きな場所に「mac_monitoring.sh」とか、
'好きな名前.sh'ってテキストファイルを作成。  
2. スクリプト内容をコピペ、保存。不要な処理あればコメントアウト。  
3. Mac標準のターミナルを起動。  
4. 「chmod 755 」と打った後に、作成したスクリプトをドラックアンドドロップ。  
  →例「chmod 755 /Users/user01/Desktop/monitoring.sh」  
5. 作成したスクリプトファイルをターミナルにドラックアンドドロップして、エンター。  
6. モニタリング開始ならy押下してエンター。  
7. 何か作業しても良いし、無風確認として放置しても良い。  
8. 止めたくなったらy押下してエンター。  
9. ログフォルダ開くので中身を確認。ログの加工などお好みで。  

# src  

<details><summary>script</summary>

```bash
#!/bin/bash
clear
echo ""
echo "**** **** **** ****"
echo ""

echo "monitoring tool"
echo "log this mac's resource by some commands every 10 seconds"
echo ""
echo "**** **** **** ****"
echo ""

read -p "start monitoring? (y/N) : " YN
if [ "$YN" = "y" ]; then
  echo "start monitoring"
else
  echo "bye"
  echo ""
  echo "**** **** **** ****"
  echo "5 seconds wait..."
  sleep 5
  echo ""
  clear
  exit
fi
echo ""
echo "**** **** **** ****"
echo ""


DATE=`date +%Y%m%d`
DATETIME=`date +%Y%m%d_%H%M%S`
LOGD=/tmp/"$DATE"_mon_log
mkdir -p "$LOGD"

hostinfo >> "$LOGD"/`hostname`_hostinfo_"$DATETIME".txt
uptime >> "$LOGD"/`hostname`_uptime_"$DATETIME".txt

TOPLOGD="$LOGD"/"$DATE"_top
mkdir -p "$TOPLOGD"
echo "checking cpu, mem by top"
while true ; do DATETIME=`date +%Y%m%d_%H%M%S` ;  top -o mem -l 1 >> "$TOPLOGD"/`hostname`_top_"$DATETIME".txt ; sleep 10 ; done &
TOPPID=$!

PSLOGD="$LOGD"/"$DATE"_ps
mkdir -p "$PSLOGD"
echo "checking process, cpu, mem by ps"
while true ; do DATE=`date +%Y%m%d` ; DATETIME=`date +%Y%m%d_%H%M%S` ;  ps aux >> "$PSLOGD"/`hostname`_ps_"$DATETIME".txt ; sleep 10 ; done &
PSPID=$!

VMSTATLOGD="$LOGD"/"$DATE"_vm_stat
mkdir -p "$VMSTATLOGD"
echo "checking mem by vm_stat"
vm_stat -c 86400 10 >> "$VMSTATLOGD"/`hostname`_vm_stat_"$DATETIME".txt &
VMSTATPID=$!

IOSTATLOGD="$LOGD"/"$DATE"_iostat
mkdir -p "$IOSTATLOGD"
echo "checking disk io by iostat"
iostat 10 >> "$IOSTATLOGD"/`hostname`_iostat_"$DATETIME".txt &
IOSTATPID=$!

NETSTATLOGD="$LOGD"/"$DATE"_netstat
mkdir -p "$NETSTATLOGD"
echo "checking NW io by netstat"
netstat 10 >> "$NETSTATLOGD"/`hostname`_netstat_"$DATETIME".txt &
NETSTATPID=$!
echo ""
echo "**** **** **** ****"
echo ""

jobs
echo ""
echo "**** **** **** ****"
echo ""

while :
do
  read -p "stop monitoring? (y/N) : " YN
  if [ "$YN" = "y" ]; then
    echo "stop monitoring"
    break
  elif [ "$YN" = "n" ]; then
    echo "still monitoring"
  else
    echo "type y or n"
  fi
done
echo ""
echo "**** **** **** ****"
echo ""

kill -1 $TOPPID
kill -1 $PSPID
kill -1 $VMSTATPID
kill -1 $IOSTATPID
kill -1 $NETSTATPID
sleep 5
echo ""
echo "**** **** **** ****"
echo "check no jobs"

jobs
echo ""
echo "**** **** **** ****"
echo ""

echo "result : $LOGD"
echo "bye"
echo ""
echo "**** **** **** ****"
echo "10 seconds wait..."

sleep 10
echo ""
clear
open $LOGD
```

</details>

# log chk exam  
```
grep "CPU usage" /*/*/*.* > /tmp/cpulog.txt  
grep "Phy" /*/*/*.* > /tmp/memlog.txt  
grep "written" /*/*/*.*> /tmp/diskiolog.txt  
```

あとはエクセルにスペース区切りで読み込んで、  
開始時間から10秒ごとにそれぞれの列を線グラフとかにするとか、  
特定のプロセスについて深く見るならps結果とか。  


:::note info
Bashでのログ加工の例として、以下をご利用ください。

https://qiita.com/kubo4ka/items/142573fb8d5bb7fa1eb4

:::

# image exam

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562068/74fa268a-ed43-417d-94c4-ec3317ba5042.png)


以上