클라이언트가 연결될 때 낮은 양호 수준(높은 우선 순위)이 필요한 폐쇄 소스 애플리케이션이 있고 클라이언트가 연결되지 않을 때 유지 관리 작업을 실행하며 높은 양호 수준(낮은 우선 순위) 실행에서 유지 관리 작업을 실행하고 싶습니다.
특정 포트에 연결이 설정되고 모든 연결이 닫힐 때 스크립트가 실행되도록 트리거하는 일부 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