C Pottinger Ответов: 1

Условное убийство процесса с помощью awk


Привет ребята,

Я пытаюсь объединить пару команд awk, и мне не везет. Идея состоит в том, чтобы убить процесс, если в течение определенного периода времени было меньше определенного количества загрузочного трафика.

Любая помощь будет оценена по достоинству.

Что я уже пробовал:

Я могу получить следующее, Чтобы правильно найти PID запущенного процесса qbittorrent:
echo $( ps aux | grep "[q]bittorrent" | awk '{ print $2 }' )

И следующее скажет мне, была ли низкая активность загрузки в течение последних нескольких секунд:
collectl -c1 -i5 -sn | awk 'NF==4 && $2<200  { print $1 }'
Выходные данные - это объем КБ, загруженный за последние 5 секунд.

Теперь я хочу объединить их - заменив print $1 во второй команде с "убить" следует вывод первой команды.

Я попробовал несколько вариантов, таких как
sudo $( collectl -c1 -i5 -sn | awk 'NF==4 && $2<20 { print "kill " $( ps aux | grep "[q]bittorrent" | awk '{ print $2 }' ) }' )
но безрезультатно.

1 Ответов

Рейтинг:
5

Jochen Arndt

Вы должны поместить команды в сценарий оболочки. Затем вы можете использовать переменные, условия и многое другое.

Непроверенный пример без проверки пустых переменных:

#!/bin/bash

MIN_ACT=10
ACTIVITY=$( collectl -c1 -i5 -sn | awk 'NF==4 && $2<200 { print $1 }' )
if [ $ACTIVITY -lt $MIN_ACT ]; then
    TORR_PID=$( ps aux | grep "[q]bittorrent" | awk '{ print $2 }' )
    kill -s SIGTERM $TORR_PID
fi


C Pottinger

Спасибо. Это научило меня достаточно, чтобы придумать этот сценарий:

#!/bin/bash

MIN_ACT=200

echo Looking for running qBitorrent. Please wait...
TORR_PID=$( ps aux | grep '[q]bittorrent' | awk '{ print $2 }' )
if [ -z "$TORR_PID" ]; then
    echo qBittorrent not found.
else
    echo Collecting traffic infomation. Please wait...
    ACTIVITY=$( collectl -c1 -i5 -sn | awk 'NF==4 { print $1 }' )
    if [ $ACTIVITY -lt $MIN_ACT ]; then
        echo Traffic is low. Killing qBittorrent PID:$TORR_PID. Please wait...
        kill -s SIGTERM $TORR_PID
    fi
fi
echo killqb done.