포트에 연결이 열려 있을 때 스크립트를 실행하는 방법은 무엇입니까?

포트에 연결이 열려 있을 때 스크립트를 실행하는 방법은 무엇입니까?

클라이언트가 연결될 때 낮은 양호 수준(높은 우선 순위)이 필요한 폐쇄 소스 애플리케이션이 있고 클라이언트가 연결되지 않을 때 유지 관리 작업을 실행하며 높은 양호 수준(낮은 우선 순위) 실행에서 유지 관리 작업을 실행하고 싶습니다.

특정 포트에 연결이 설정되고 모든 연결이 닫힐 때 스크립트가 실행되도록 트리거하는 일부 iptables 또는 유사한 메커니즘이 있습니까?

애플리케이션이 UDP 포트에서 수신 대기 중이므로 상황이 복잡해질 수 있습니다.

답변1

좀 더 조사한 결과 이 ss​​명령에 몇 가지 유용한 기능이 있다는 것을 알게 되었습니다.

-E이벤트 스트림을 제공하지만 TCP 연결에만 유용한 것 같습니다. 설정된 연결과 닫힌 연결을 계산할 수 있지만 UDP 연결에 대해서는 아무것도 인쇄되지 않습니다.

하지만 다음을 사용하는 동안 Recv-Q 값을 확인할 수 있습니다.ss -una state all '( sport = :<port> )'

0으로 충분히 오랫동안 유지되면 프로세스의 우선 순위를 낮출 수 있고, 0보다 크면 프로세스의 우선 순위를 지정할 수 있습니다.

나는 결국 스크립트를 작성했습니다.

#!/bin/bash

state=idle
count=0
fstate=idle
ramptime=3
pid=$1
port=$2

while true; do
        while [ $count -lt $ramptime ]; do
                sleep 1
                activity=$(ss -unHa state all '( sport = :'$port' )' | awk '{ print $2 };')
                if [ $activity -eq 0 ]; then
                        fstate=idle
                else
                        fstate=active
                fi
                if [ $fstate = $state ]; then
                        count=0
                else
                        count=$((count+1))
                fi
                #echo $activity $count $state $fstate

        done
        count=0
        state=$fstate
        case $state in
                idle)
                        ramptime=3
                        schedtool -D $pid
                        renice 20 -p $pid
                        ionice -c 3 -p $pid
                ;;
                active)
                        ramptime=30
                        schedtool -R -p 1 $pid
                        renice -10 -p $pid
                        ionice -c 2 -p $pid
        esac
done

관련 정보