需要到几百台机器上去删除一些目录,每台机器上的目录名固定,共有12个,
有一台机器(A)可以免密码ssh到这几百台机器上,
刚开始使用如下命令:
ssh remoteHost -t 'nohup sudo rm -rf /opt/data01/mapred/local/toBeDeleted/ &'
发现远程机器上的命令执行不起来,ssh 到远程机器上,使用nohup + & 不可行。
后来的解决办法:
编写脚本,del.sh
#!/bin/bash
arr="/opt/data01/mapred/local/ /opt/data02/mapred/local/ /opt/data03/mapred/local/ /opt/data04/mapred/local/ /opt/data05/mapred/local/ /opt/data06/mapred/local/ /opt/data07/mapred/local/ /opt/data08/mapred/local/ /opt/data09/mapred/local/ /opt/data10/mapred/local/ /opt/data11/mapred/local/ /opt/data12/mapred/local/"
for dir in $arr;do
{
rm -rf $dir
} &
sleep 3
done
这个脚本会并发的执行对12个目录的删除操作,将这个脚本分发到几百台机器上,
for i in `cat /home/hdfs/lxw/delete_to_be_deleted/mapred.hosts.all `; do scp -P58422 /home/hdfs/lxw/del.sh $i:/tmp/del.sh ; done
其中mapred.hosts.all中保存了几百台机器的ip,del.sh复制到目标机器的/tmp目录
机器A上调用命令
ssh $host -p 58422 -t 'sudo nohup sh /tmp/del.sh'
在机器A上写了个多线程的perl脚本,delete_tobedeleted.pl
并发的去调远程机器上的del.sh,调完之后,机器A上的线程会退出,而远程机器上会有12个进程,分别在后台执行每个目录的rm操作。
[hdfs@hd0411-sw39 ~]$ ps -ef | grep rm
root 2899 2898 9 09:12 pts/1 00:00:02 rm -rf /opt/data05/mapred/local/toBeDeleted/
root 3096 3095 8 09:12 pts/1 00:00:01 rm -rf /opt/data06/mapred/local/toBeDeleted/
root 3205 3204 13 09:12 pts/1 00:00:02 rm -rf /opt/data07/mapred/local/toBeDeleted/
root 3330 3329 8 09:12 pts/1 00:00:01 rm -rf /opt/data08/mapred/local/toBeDeleted/
root 3656 3655 9 09:12 pts/1 00:00:01 rm -rf /opt/data09/mapred/local/toBeDeleted/
root 3990 3989 6 09:12 pts/1 00:00:00 rm -rf /opt/data10/mapred/local/toBeDeleted/
root 4101 4100 9 09:12 pts/1 00:00:00 rm -rf /opt/data11/mapred/local/toBeDeleted/
root 4255 4254 5 09:12 pts/1 00:00:00 rm -rf /opt/data12/mapred/local/toBeDeleted/
delete_tobedeleted.pl脚本内容,见: