Bash 处理来自远程服务器的 PID 的脚本
Bash Script with Handling PID's from Remote Server
我有通过 RSYNC 下拉视频内容的盒子。 +- 700 个盒子,我目前正在测试四个盒子。
每个盒子上都有一个 bash 脚本,用于通过中央服务器的反向 RSYNC 拉下内容。
我想通过以下方式管理这些与服务器的连接:
仅针对此特定任务的 RSYNC 连接必须限制为最多 50 个连接(不是整个 RSYNC,因为其他任务依赖于它)。
如果达到 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 }'
这returns以下:(PID的)
13358
13383
13401
13452
请记住,第 1 点和第 2 点。我将如何实现这一目标。谢谢!
你可以做到这一点。提取按 start_time 排序的所有 pids 并将它们放入数组中。
declare -a pids
pids=($(ps -u test --sort=start_time | grep '[r]sync' | awk '{print }'))
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 }'))
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
我有通过 RSYNC 下拉视频内容的盒子。 +- 700 个盒子,我目前正在测试四个盒子。
每个盒子上都有一个 bash 脚本,用于通过中央服务器的反向 RSYNC 拉下内容。
我想通过以下方式管理这些与服务器的连接:
仅针对此特定任务的 RSYNC 连接必须限制为最多 50 个连接(不是整个 RSYNC,因为其他任务依赖于它)。
如果达到 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 }'
这returns以下:(PID的)
13358
13383
13401
13452
请记住,第 1 点和第 2 点。我将如何实现这一目标。谢谢!
你可以做到这一点。提取按 start_time 排序的所有 pids 并将它们放入数组中。
declare -a pids
pids=($(ps -u test --sort=start_time | grep '[r]sync' | awk '{print }'))
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 }'))
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