ポートに接続が開いているときにスクリプトを実行する方法は?

ポートに接続が開いているときにスクリプトを実行する方法は?

クライアントが接続するときに低い良好なレベル(高い優先順位)を必要とするクローズドソースアプリケーションがあり、クライアントが接続されていないときにメンテナンスタスクを実行し、高い良好なレベル(低い優先順位)の実行でメンテナンスタスクを実行したいと思います。

特定のポートに接続が確立され、すべての接続が閉じられたときにスクリプトが実行されるようにトリガーするいくつかのiptablesまたは同様のメカニズムがありますか?

アプリケーションがUDPポートでリッスンしているため、状況が複雑になる可能性があります。

答え1

もう少し調べた結果、このssコマンドにいくつかの便利な機能があることがわかりました。

-Eイベントストリームを提供しますが、TCP接続にのみ便利です。確立された接続と閉じた接続を計算できますが、UDP接続については何も印刷されません。

ただし、次の使用中にRecv-Q値を確認できます。ss -una state all '( sport = :<port> )'

ゼロで十分に長く維持されると、プロセスの優先順位を下げることができ、ゼロより大きい場合はプロセスの優先順位を指定できます。

私は最終的にスクリプトを書いた。

#!/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

関連情報