2012-09-10 79 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