曾经有一段时间需要从集群中的一台服务器收集数据,并放到另一台服务器上。手工做了几次,实在是烦了。于是写了个脚本加上crontab来做这件事情,脚本内容大致如下:
#!/bin/sh
# file: script.sh
#1. collect some data…
#2. generate data file
scp data_file someuser@somehost:~/destination/today.data
echo "[Today] collect data completed." >> /tmp/collect.log
而crontab的内容也很简单:
* 16 * * * cd path_of_script; sh script.sh
当然,在放到crontab之前,我用手动运行过个脚本,是可以正确的收集数据,并且将收集到的数据复制到另一台服务器的指定路径。为了记录收集情况,每当执行完后,都会在/tmp的日志中写入一条log。
我在crontab中设定了让这个脚本每天下午4点钟开始执行,可是第二天下午5点钟了,同事说当天的数据没到收集到。我觉得很奇怪,登录到这台机器上发现日志里已经显示当天的"collect data completed"了,但不知道为什么,数据没有复制过去。想了想,把脚本和crontab都稍做了修改:
script.sh:
#!/bin/sh
# file: script.sh#1. collect some data…
#2. generate data file
scp data_file someuser@somehost:~/destination/today.data
echo "[Today] collect data completed."
crontab:
* 16 * * * cd path_of_script; sh script.sh &> /tmp/collect.log
不仅记录自己输出的日志,而且把scp的stdout也记录下来。第三天下午4点过了,数据依然还是没有复制到目的机器上,查看collect.log发现当天的日志是:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
lost connection
[2010-08-30] collect data completed.
这时候我才想起来,这台机器压根就没有可用的key来登录到目的机器!当初我之所以能成功地执行脚本是因为我是开启了ssh_config中的ForwardAgent,在执行脚本中的scp时,使用了我的key,而当我退出这台机器后,它便无法再登录到目的机器,因而亦不能执行scp了。
找到原因后,问题就好解决了。在收集数据的机器上使用ssh-keygen产生一对rsa公私钥对。把公钥追加到目的机器的"/home/someuser/.ssh/authorized_keys"中,然后使用scp时加上-i选项来指定私钥的位置即可,修改后的脚本如下:
#!/bin/sh
# file: script.sh
#1. collect some data…
#2. generate data filescp -i ~/.ssh/id_rsa data_file someuser@somehost:~/destination/today.data
echo "[Today] collect data completed."
记住,退出机器前先使用ssh -i ~/.ssh/id_rsa someuser@somehost来登录到目的机器,不然下次crontab运行时,scp会傻傻地等着你输入yes来确定把目的机器加到known_hosts里。