导师的项目需要一大波数据,据称至少要几十个T(吐槽,哪里有那么多数据。。。),于是我开始每天在网上找rdf的数据。大多数数据都在国外的服务器上,联通的PPPoE很不稳定,而且数据集的大小也千差万别,从几个K到数十G,用Wget下载数据每次都需不停地去检查下载状态,输出日志。考虑了一下以后要与这个任务长期为伴了,所以写了几个脚本,让服务器自己下并且负责监控下载状态,一旦有下载失败或者某个数据集下载成功,就短信提醒我。嗯,遇到的问题一一记录在这里,脚本写完之后也贴在这里。
1. 去重:!a[$0]++ "tmp"
tmp中保存了多个记录,每行一个记录。记录有重复。
我将tmp文件中的内容去重后输出到另外一个文件uniq,如果这样写:
echo ${awk !a[$0]++ "tmp"} > "uniq"
会导致uniq中所有记录都在同一行,如果写成这样:
cat "tmp" | awk '!a[$0]++' > "uniq"
就保持了原来的格式,每条记录一行。
2. 监控的实现——用msmtp和mutt发送邮件。
安装msmtp:
tar jxf msmtp-1.4.16.tar.bz2 ./configure --prefix=/usr/local/msmtp make make install
安装mutt:
tar zxf mutt-1.5.21.tar.gz ./configure make make install
配置msmtp:
cd ~ vi .msmtprc host smtp.163.com #你的邮件服务器地址 tls off #关闭tls auth plain #设定登录方式 from youraddress@163.com #发送Email的邮件地址 user yourname #发送Email的用户名 password yourpassword #发送Email的用户名密码
3. awk默认分隔符是空格、tab、换行等一切空白符号,使用多个字符组成的字符串做分隔符时,用-F参数指定:-F "string1|string2".
4. 由于脚本之间存在互相调用的关系,但是调用和被调用者的运行时间不一定,所以在调用时要避免因为父进程退出而导致子进程也被同时杀死,用”&“将命令放在后台执行还不够,这样虽说父进程可以不等待子进程执行完毕,但是一旦父进程退出,子进程也跟着被杀死(收到父进程发来的hup信号),所以,在调用子脚本前,使用”nohup“。