クライアントが接続するときに低い良好なレベル(高い優先順位)を必要とするクローズドソースアプリケーションがあり、クライアントが接続されていないときにメンテナンスタスクを実行し、高い良好なレベル(低い優先順位)の実行でメンテナンスタスクを実行したいと思います。
特定のポートに接続が確立され、すべての接続が閉じられたときにスクリプトが実行されるようにトリガーするいくつかの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