2012-09-10 57 views
1

我正在做一个开源的rsync管理器,需要能够从服务器端杀死客户端rsync进程。获取远程rsync PID?

现在,2个客户端将rsync从服务器上传到clinet,客户端将rsync命令发送到服务器并通过ssh密钥进行身份验证。

客户为例-1和客户端2两者:

rsync -zav [email protected]:/home/aaa . 

服务器:

ps aux | grep rsync 

root  6117 8.9 0.7 87524 60604 ?  Ds 00:23 0:26 rsync --server --sender -vlogDtprz . /home/aaa 
root  6339 8.6 0.6 87524 58792 ?  Ds 00:23 0:25 rsync --server --sender -vlogDtprz . /home/aaa 

问题是我需要知道哪个的pid对应于这些单独的客户端rsync命令。为了能够杀死他们,任何人都可以指出一些方向?

回答

1

一种方法是写在服务器(/usr/bin/run_rsync)的脚本:

#!/bin/bash 

client_ip=$1 
client_id=$2 
client_path=$3 
rsync_script=~/rsync_CID$client_id 
echo "rsync -zav /home/aaa [email protected]$client_ip:$client_path" > $rsync_script 
sh $rsync_script 
rm $rsync_script 

然后使用来自客户端的这个脚本(ssh [email protected] run_rsync <IP> <ID> $(pwd))。而当你想杀死一个客户端,在服务器(给出$client_id):

pstree $(pgrep CID$client_id) -ap | sed -n 's/.*rsync,\([0-9]*\).*/\1/p' 

应该给你这个客户正在使用的rsync的PID。

+0

感谢您的回答,一个问题,如果$ client_ip在NAT后面,无论如何要做到这一点?我现在想在authorized_keys上做一些验证,试图将client_id注入参数。 – c2h2

+0

应该可以使用端口转发并为每个客户端使用不同的端口号(请参阅rsync'--port'选项)。也许你甚至可以使用这些端口号来grep你感兴趣的客户端的PID(不使用上面的包装器)。 – perreal