当端口上打开连接时如何运行脚本?

当端口上打开连接时如何运行脚本?

我有一个封闭源代码的应用程序,当客户端连接时,需要较低的良好级别(高优先级),当没有客户端连接时,它会运行维护任务,我希望以较高的良好级别(低优先级)运行。

当在特定端口上建立连接以及所有连接关闭时,是否有一些 iptables 或类似的机制来触发脚本运行?

该应用程序正在侦听 UDP 端口,这可能会使事情变得复杂。

答案1

我做了一些更多的挖掘,发现该ss命令有一些有用的功能:

-E为我们提供了一个事件流,但似乎只对 TCP 连接有用。我们可以计算已建立和关闭的连接,但 udp 连接没有打印任何内容。

但我们可以在使用时检查 Recv-Q 值ss -una state all '( sport = :<port> )'

如果它保持 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

相关内容