Скрипт Bash с обработкой PID с удаленного сервера - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть коробки, загружающие видео контент через RSYNC. + - 700 ящиков, где я сейчас тестирую с четырьмя ящиками.

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

Я бы хотел управлять этими подключениями к серверу следующим образом:

  1. Максимальное количество подключений должно быть не более 50 для RSYNC только для этой конкретной задачи (не для RSYNC в целом, так как от этого зависят другие задачи).

  2. Если предел соединения в 1. достигнут, то он должен уничтожить самый ранний созданный PID.

Данные, представленные ниже, представлены на сервере, где находятся видео.

root@TESTSRV01:~# ps aux | grep rsync
1029     13357  0.0  0.0   4308   604 ?        Ss   11:46   0:00 sh -c rsync --server --sender -vre.iLs --bwlimit=100 --append --append . /home/test/Videos/
1029     13358  0.1  0.0  30852  1444 ?        S    11:46   0:00 rsync --server --sender -vre.iLs --bwlimit=100 --append --append . /home/test/Videos/
1029     13382  0.0  0.0   4308   604 ?        Ss   11:47   0:00 sh -c rsync --server --sender -vre.iLsf --bwlimit=100 --append --append . /home/test/Videos/
1029     13383  0.1  0.0  39432  1800 ?        S    11:47   0:00 rsync --server --sender -vre.iLsf --bwlimit=100 --append --append . /home/test/Videos/
1029     13400  0.0  0.0   4308   604 ?        Ss   11:47   0:00 sh -c rsync --server --sender -vre.iLs --bwlimit=100 --append --append . /home/test/Videos/
1029     13401  0.1  0.0  39432  1800 ?        S    11:47   0:00 rsync --server --sender -vre.iLs --bwlimit=100 --append --append . /home/test/Videos/
1029     13451  0.0  0.0   4308   608 ?        Ss   11:48   0:00 sh -c rsync --server --sender -vre.iLs --bwlimit=100 --append --append . /home/test/Videos/
1029     13452  0.0  0.0  71128  2248 ?        S    11:48   0:00 rsync --server --sender -vre.iLs --bwlimit=100 --append --append . /home/test/Videos/

Из скрипта на коробке у меня пока есть следующее:

ps -u test | grep rsync | awk '{ print $1 }'

Возвращает следующее: (Какие PID)

13358
13383
13401
13452

Имея в виду, пункты 1. и 2. как бы мне этого добиться. Спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

Вы могли бы сделать это.Извлеките все pids, отсортированные по start_time, и поместите их в массив.

declare -a pids
pids=($(ps -u test --sort=start_time | grep '[r]sync' | awk '{print $1}'))
if [[ "${#pids[@]}" -gt 50 ]]; then
   # I am not sure how many process you want to kill. 
   # Let say you want to kill the first one.
   kill -9 "${pids[0]}"
fi

Примечание: шаблон grep '[r]sync' вместо 'rsync', поскольку он исключает саму команду grep.

В случае, если вы хотите ограничить общее количество процессов до 50. Вы можете сделать что-то вроде этого:

declare -a pids
pids=($(ps -u test --sort=start_time | grep '[r]sync' | awk '{print $1}'))
if [[ "${#pids[@]}" -gt 50 ]]; then
    # You want to kill all execess processes
    excess=$((${#pids[@]} - 50))
    echo "Excess processes: $excess"
    kill -9 "${pids[@]:0:$excess}"
fi 
...