我有一个封闭源代码的应用程序,当客户端连接时,需要较低的良好级别(高优先级),当没有客户端连接时,它会运行维护任务,我希望以较高的良好级别(低优先级)运行。
当在特定端口上建立连接以及所有连接关闭时,是否有一些 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