Если сервис начинает подвисать, это часто видно по сети: соединения зависают в SYN-SENT, CLOSE-WAIT или сидят в одном состоянии слишком долго. Это можно определить прямо в bash, без netstat/ss.
1️⃣ Читаем таблицу соединений из /proc/net/tcp
Формат /proc/net/tcp содержит:
local addr/port
remote addr/port
state
inode (ключ!)
Мы будем искать ошибочные или зависшие состояния.
grep -E "$(echo $hung_states | sed 's/ /|/g')" /proc/net/tcp |
while read -r _ _ _ state _ _ _ _ inode _; do
echo "$inode"
done
2️⃣ Привязка inode к PID процесса. Каждый сокет отображается как
/proc/$pid/fd/* → socket:[inode].
find_pid_by_inode() {
inode=$1
for p in /proc/[0-9]*/fd/*; do
if readlink "$p" 2>/dev/null | grep -q "socket:\[$inode\]"; then
echo "$p" | cut -d/ -f3
fi
done
}
3️⃣ Перезапуск сервиса
for inode in $(get_hung_inodes); do
pid=$(find_pid_by_inode "$inode")
svc=$(ps -p "$pid" -o comm=)
echo "Hung socket in PID $pid ($svc)"
case "$svc" in
nginx) systemctl restart nginx ;;
sshd) systemctl restart sshd ;;
myapp) systemctl restart myapp ;;
esac
done
▪️Получаем:
- Автоматический поиск зависших TCP-соединений;
- Связь сокета с реальным процессом;
- Перезапуск только нужного сервиса;
Такой подход полезен для nginx, API-сервисов, баз данных и любых демонов, которые иногда залипают в сетевых состояниях.
BashTex 📱 #bash #utils