59 lines
1.6 KiB
Bash
59 lines
1.6 KiB
Bash
#!/bin/bash
|
|
|
|
CPU_THRESHOLD=90.0
|
|
TIME_THRESHOLD=$((10 * 3600)) #10 hours in seconds
|
|
|
|
# Getting all Process IDs running on Port 445 or 139 (Default SMB ports)
|
|
SMB_PIDS=$(ss -tanp '( sport = :445 or sport = :139 )' 2>/dev/null \
|
|
| awk -F ',' 'NR>1 && $2 ~ /pid=/ {
|
|
split($2,a," ");
|
|
split(a[1],b,"=");
|
|
print b[2]
|
|
}' | sort -u)
|
|
if [ -z "$SMB_PIDS" ]; then
|
|
echo "No SMB connections found."
|
|
exit 0
|
|
fi
|
|
|
|
# Checking to see if any PIDs exceed CPU or Time thresholds
|
|
ps -axo pid,comm,pcpu,etime | awk -v cpu="$CPU_THRESHOLD" -v time="$TIME_THRESHOLD" -v smb_pids="$SMB_PIDS" '
|
|
BEGIN {
|
|
split(smb_pids, arr, " ")
|
|
for (i in arr) {
|
|
smb[arr[i]] = 1
|
|
}
|
|
}
|
|
NR > 1 {
|
|
if(!($1 in smb)) {
|
|
next
|
|
}
|
|
|
|
# Converting etime into seconds
|
|
split($4, parts, "-")
|
|
if (length(parts) == 2) {
|
|
days=parts[1]
|
|
hms=parts[2]
|
|
} else {
|
|
days=0
|
|
hms=parts[1]
|
|
}
|
|
|
|
split(hms, t, ";")
|
|
if (length(t) == 3) {
|
|
h=t[1]; m=t[2]; s=t[3]
|
|
} else if (length(t) == 2) {
|
|
h=t[1]; m=t[2]; s=0
|
|
} else {
|
|
h=0; m=0; s=0
|
|
}
|
|
|
|
elapsed = days*86400 + h*3600 + m*60 + s
|
|
|
|
# Comparing elapsed to thresholds
|
|
if ($3 >= cpu && elapsed >= time) {
|
|
printf "PID: %s | Command: %s | CPU: %s%% | Runtime: %s (%.2f hours)\n,$1, $2, $3, $4, elapsed/3600"
|
|
}
|
|
}'
|
|
|
|
|
|
|