Linux下的mongodb服务脚本,以备不时之需

前些天,一位开发同事找到我,说他测试环境的 mongodb 经常挂掉,要我写一个监控或复活的脚本。我觉得很奇怪,测试环境又没啥负载,经常挂掉肯定有非常规原因。

跑过去看了一下日志,发现存在 stop 记录,我就纳闷了,没人操作他还会自己 stop。这明显不是挂掉了,于是到 history 中看了下同事的启动命令:

原来如此!因为他没有用 nohup 启动,所以只要他的终端离线或者关闭,mongodb 就会自动退出了!解决办法很简单,如下启动即可:

这样敲命令也着实苦逼,所以从网上找了一个 mongodb 服务脚本就舒服多了:

将代码保存到 /etc/init.d/mongodb,然后使用 chmod +x /etc/init.d/mongodb 添加执行权限。

现在,就可以使用 service 命令来控制 mongodb 了:

非常简单,贴到博客记录一下,以备不时之需。

Linux/vps本地七天循环备份和七牛远程备份脚本

博客前些时间分享过一次 vps 远程备份到七牛的工具,全傻瓜式交互操作,但也有一个很大的缺憾,那就是不够灵活,在无人干预的情况下,无法完成对多个站点的远程备份设置。

这次博客搬家到 vps 后,张戈花了点时间完善了下,实现了多站点,多数据库的本地七天循环备份和同步备份至七牛云存储的脚本。

Linux/vps本地七天循环备份和七牛远程备份脚本

一、类型说明

①、七天循环备份

受服务器空间制约,我们不可能在 VPS 上每天都备份一份新的网站数据,一是没必要,二是占空间。我们折中一下,采用星期命名,每次备份将覆盖上星期同一天的文件。从而只备份 7 份数据,不至于占用特别大的空间。

如果,你的 vps 很小家子气或是网站数据太庞大,那还可以再折中一下,仅在星期二、四、六做备份,即总共三份数据。甚至还可以选一个星期的某一天做备份,即一周备份一次,也是可以的。

在空间允许的情况下,个人推荐做 7 天循环备份,在 vps 数据全部丢失的时候,能最大程度的容灾,恢复到丢失前一天,甚至是当天凌晨备份的所有数据,非常完美!

②、七牛远程备份

七牛远程备份就是将本地的 7 天备份的数据每天同步至七牛云存储私人空间,就算整台 vps 奔溃时,还能从容的恢复数据。相当于双保险,要知道七牛和你的 vps 同时宕机的几率是非常小的。

二、准备工作

①、整理 vps 已有网站对应的数据库用户名和密码(如不清楚可直接用 mysql 的 root 帐号);

②、整理 vps 已有网站的根目录所在路径,比如 /home/wwwroot/zhangge.net

③、想好本地想要存放备份文件的路径,比如/home/wwwbackup

④、还没有七牛帐号的,点此注册一个,然后新建一个私人空间(为了数据安全,请勿使用公开空间,仅恢复数据时临时切换到公开状态即可),记录空间名以及帐号密钥:

Linux/vps本地七天循环备份和七牛远程备份脚本

Linux/vps本地七天循环备份和七牛远程备份脚本

三、本地七天备份

①、登录 VPS 编写脚本

脚本代码如下:

使用说明:

②、将代码中的 2 处 mypassword 改成你自定义的压缩密码(确保数据安全),并保存为 backup.sh 之后,执行 chmod +x backup.sh 赋执行权限。

为了避免复制转码问题,下文已打包分享[点此直达]

Ps:下载的代码包没有加密打包,请自行参考上述代码,自行加上【-P 密码】参数。

③、执行./backup.sh –help 可获得如下帮助说明:

Linux/vps本地七天循环备份和七牛远程备份脚本

④、备份数据库

命令行示例如下:

命令参数说明:

参数 1:db,设置备份类型为数据库

参数 2:domain 网站域名,如 zhangge.net,用于备份文件命名

参数 3:dbname  要备份的数据库名次,如 zhangge_db

参数 4:mysqluser  mysql 用户名,如不清楚可用 mysql 的 root 帐号

参数 5:mysqlpassword  mysql 密码

参数 6:back_path  备份文件存放路径

⑤ 备份网站文件:

命令行示例:

命令参数说明:

参数 1:file,设置备份类型为网站文件

参数 2:domain 网站域名,如 zgboke.com,同样用于备份文件的命名

参数 3:site_path 网站文件的路径,如/home/wwwroot/zgboke.com

参数 4:back_path 备份文件存放路径

Tips:为了方便后面的七牛同步,建议将备份文件存放到同一个上级目录,然后以网站域名来命名当前目录,比如,同一个 vps 的备份数据,我都放到/home/wwwbackup/,然后以各自的网站域名来命名,zhangge.net 的数据库和文件我都统一存放到/home/wwwbackup/zhangge.net。

最新补充:2014/10/25 日,手动执行命令检查时,发现报如下错误信息:

Access denied for user ‘dbuser’@’localhost’ to database ‘db’ when using LOCK TABLES

即提示该用户不具备锁表权限,导致数据导出失败!这种情况一般发生在数据库正在执行某个查询动作,此时普通帐号是无法导出备份的!

解决办法:

方法①、修改上面的备份脚本,找到如下行

添加–skip-lock-tables 参数即可,即不锁表导出(可能丢失某些正在更新的数据,当然凌晨时候几率很小)。

方法②、使用 root 帐号执行备份即可:

执行 crontab -e 修改 Linux 计划任务,修改数据库备份计划命令行中的用户名为 mysql 的 root 帐号:

个人推荐方法②,最大限度的保证了数据备份的完整度!

⑥、建立七天备份的任务计划

I. 先执行 crontab -l 看看命令是否存在,若不存在,请使用  yum -y install vixie-cron crontabs 安装 crond

II. 确认 crond 已存在后,请执行/etc/init.d/crond start 确保启动了 crond 服务,并执行 chkconfig crond on 设置为开机启动。

III. 执行 crontab -e 建立任务计划,如下是我的 vps 的任务计划,请参考添加:

每个网站 2 行,第一行备份数据库,第二行备份网站文件。

crontab 参数格式为 {分 时 日 月 周 + 命令行}

所以,拿第 2 行来说,就是 每天的凌晨 3 点,执行后面的命令行,最后的>/dev/null 2>&1 表示屏蔽任何日志信息。

注意事项:脚本需要写绝对路径,比如/root/scripts/backup.sh 并且要有执行权限,可以再次执行 chmod +x 来赋权

作完以上步骤之后,你的 VPS 已经实现了本地七天循环备份机制。下面说下同步至七牛的方法。

四、七牛远程备份

远程备份至七牛的原理,在之前的博文已经说明,不清楚的请参考:http://zhangge.net/4221.html

下面说具体做法:

①、下载我整理好的七牛同步工具包(仅提供 64 位):

备用下载:

②、将工具包解压:

unzip QN_Backup_tools.zip

解压完成后,会得到一个 tools 文件夹,里面有三个文件,分别为:

qrsync:七牛同步工具仅适合 Linux64 位,其他版本请点此下载相应版本替换此文件

qrsync.conf :通用配置模版

config.sh:配置初始化辅助脚本

③、配置 qrsync 和计划任务

I. 会用 vim 和 crontab -e 的童鞋 可以无视 config.sh,直接使用 vim 编辑 qrsync.conf:

修改代码中的 /home/wwwbackup 、Your AK 、Your SK、bucket_name 三个参数即可。

/home/wwwbackup 表示要同步到七牛的目录,即上文七天备份的文件存放路径

Your AK:你的七牛帐号 Access_key

your SK:你的七牛帐号的Secret_key

bucket_name:准备存放备份文件的七牛私人空间名字

改完后,执行 crontab -e 添加如下计划任务:

Ps:代码表示每天凌晨 4 点同步至七牛,记得要修改 qrsync 和 qrsync.conf 的实际路径。

II. 不熟悉 vim 和 crontab 的同学,可如下执行我写好的初始化脚本:config.sh

完成以上所有步骤之后,你的 vps 就实现了本地七天循环备份和七牛远程备份了!

五、附加说明

①、注意事项

I. 考虑到脚本适用性,压缩时会包含文件的绝对路径,而解压时也将恢复原来的绝对路径。

比如,解压 zhangge.net_7.zip,所有文件将带上备份前的路径:/home/wwwroot/zhangge.net/

看得懂脚本、又不想带路径压缩的同学,可以自行修改下,让脚本只压缩网站目录。

比如,将脚本第 29 行修改如下即可实现:

注意网站目录名必须和输入的 domain 一致!看不懂脚本的,不建议修改,带了绝对路径也不影响后期手动恢复!

II. 备份文件会带有脚本执行者的权限,比如备份脚本是以 root 身份执行,那么这个压缩包解压后的文件的所有者和权限都是 root,那么在恢复网站数据时,必须使用 chmod 恢复权限到当前的 web 使用者,比如 lnmp 一件安装的环境,web 的使用者是 www,那么解压缩备份文件后,记得执行:chown -R www:www /网站路径  恢复所有者权限,否则打开网站可能出现空白页!

②、贴上我的 vps 计划任务截图,供参考:

Linux/vps本地七天循环备份和七牛远程备份脚本

③、本地备份截图:

Linux/vps本地七天循环备份和七牛远程备份脚本

Ps:文件中的数据表示星期几,带 db 的表示数据库,没带的表示网站文件,每个网站最终将有 14 份文件(7 个数据库备份,7 个网站文件备份)。

④、七牛备份截图:

Linux/vps本地七天循环备份和七牛远程备份脚本

 

Linux/vps本地七天循环备份和七牛远程备份脚本

和本地数据保持一致,七牛同步工具还有一个优点,通过哈希值判断文件是否有更新,而不重复同步相同文件,所以每天的七牛同步其实只会同步当天生成的备份包。

六、展望

本文到此就要告一段落了,仔细想想可以发现,还是存在一定的改善空间。

比如,还可以加上网站恢复机制。同步一些帐号等配置数据到七牛,当 vps 完全奔溃,数据无法找回时,可直接通过脚本等工具从七牛下载数据,然后按照写好的配置数据,自动将数据恢复到指定日期。完全无需过多的人工干预。想想都觉得很强大,是不?

如果有一套全自动恢复机制,不但可以在 vps 完全奔溃时快速恢复,还可以用于全自动网站搬家,有没有感觉像最近推出的的多备份服务?

其实,要实现也非常简单,多写一个脚本就可以实现,只是考虑到实用性、环境兼容性等因素,暂时就不花精力去实现了。

2016 年 12 月 16 日更新:博客目前已分享阿里云主机从内网备份到 OSS 方案【点此前往】。

Linux操作系统DNS解析(nameserver)监控脚本


一、起因

昨天,开发组兄弟发现 resin 日志出现不少支付宝业务报错信息,用户用支付宝购买了产品,钱到账后公司系统却未返回支付成功状态!

这还得了?用户明明支付成功了,结果却显示未到账!!!必须赶紧解决,用户投诉是小,用户流失就大了!仔细分析日志后,发现是解析支付宝接口域名(mapi.alipay.com)时出现延时,导致获取不到支付成功的返回信息!

检查发现 OpenSUSE 的 nameserver 居然是谷歌的公用 DNS:8.8.8.8!!!尼玛,不出问题才怪呢!

二、解决

虽然阿里新推出了公用 DNS:223.5.5.5,223.6.6.6,但这是内部解析外部域名,所以就近的 nameserver 是最快的,于是赶紧给换成了公司专用的 nameserver,问题立马解决了!

然后批量替换了 200 多台服务器中的 nameserver 为 8.8.8.8 的问题系统,以绝后患。

三、绸缪

仔细考虑后,决定加上 nameserver 的相关监控:

①、编写脚本:

vim mon_nameserver

②、加入任务计划

crontab -e

每五分钟执行一次,检查 mapi.alipay.com 的解析时长,若解析失败或时间大于 0.3s 则发送报警信息到监控 APP 上。 下面是将延时阈值设置为 0.001s 的测试报警截图:

Linux操作系统DNS解析(nameserver)监控脚本

四、附加

这个脚本只是用于特定情况,并非常用功能,仅供参考!脚本核心功能使用的是 curl 获取域名解析时长,下面简单的补充一下 curl 部分参数:

  • time_namelookup:DNS 解析域名的时间
  • time_commect:client 和 server 端建立 TCP 连接的时间
  • time_starttransfer:从 client 发出请求;到 web 的 server 响应第一个字节的时间
  • time_total:client 发出请求;到 web 的 server 发送会所有的相应数据的时间
  • speed_download:下周速度  单位 byte/s

更多 curl 详细说明请 man 或自行搜索。

分享一个自写的Python远程命令和文件(夹)传输类

最近在跟一个自动化发布平台的建设事项,其中 Linux 系统的远程控制通道则由我独立开发完成,其中涉及到了 Linux 系统远程命令和文件传输操作。

因为之前写 Linux 系统密码管理系统的时候,用的是 Paramiko 的 SSHClient。所以,我这次依然采用 Paramiko 来做实现,代码虽短,说起其中的坑,我也是一把辛酸一把泪的填上了。

先上完整代码:

简单说下用法:

代码很简单,不清楚的请注意代码中的注释,下面啰嗦下文件传输的说明:

①、规定目标文件夹(dst)必须以斜杠 / 结尾,否则识别为文件,而 src 因是实体存在,所以程序会自动判断是文件还是文件夹。

②、当执行本地文件夹推送至远程文件夹时,将不会保留本地文件夹名称,而是将本地文件夹内的所有文件推送到远程文件夹内,比如:

/data/srcdir/   传送到 /data/dstdir/ ,结果是 srcdir 下的所有文件会存储在 dstdir

若想保留文件夹名称,请保证两端文件夹名称一致即可,比如:

/data/srcdir/   推送到 /data/srcdir/

③、文件传输 demo:

将本地的/data/src.tar.gz 推送到 192.168.0.10 服务器的/data/files/dst.tar.gz

Ps:若 action=’pull’则表示将 src 拉取到本地的 dst。

VPS服务器备份网站文件和数据库到七牛云存储的shell脚本工具

一直想写一篇关于网站本地备份和远程备份的文章,相关草稿其实在 6.12 号就写好了,一直因为没有测试环境,没发布出来。时间久了,也就忘了,回头找个时间测试下再发布好了。

今天分享的工具也和备份有关,而且是远程备份,这个工具算是我的无聊之作吧,虽说 WordPress 已经有 wp2pcs 这类备份插件了。相信折腾 VPS 的站长会喜欢我这个工具的,因为它不会常驻占用资源。

一、工具档案

工具名称:Backup_to_QiNiu_By_ZhangGe_Ver1.0.sh

工具语言:Shell,json

工作环境:Linux

功能描述:通过 Linux 系统计划任务,将网站文件及数据库备份到七牛的免费云存储空间

额外说明:

①、工具默认使用 zip 打包,如果系统未安装 zip,将使用 tar 打包成 tar.gz 格式;

②、为了避免中文乱码,工具中全部采用洋文,张戈水平有限,可能存在蹩脚语法(下文有中文对照);

③、使用原生交互风格,未做界面菜单式优化,反正初始化也就用一次。

二、使用说明

①、下载工具:

进入 VPS 系统,执行以下命令下载工具:

 

 

②、运行工具,并根据工具提示输入信息:

 

过程如下:

下面贴上测试截图:

VPS服务器备份网站文件和数据库到七牛云存储的shell脚本工具

执行完成后,可以复制 crontab 的命令行,手动执行试试效果:

VPS服务器备份网站文件和数据库到七牛云存储的shell脚本工具

备份成功后,七牛对应的空间将可以看到刚刚备份的文件:

VPS服务器备份网站文件和数据库到七牛云存储的shell脚本工具

以上过程为初始化,只需执行一次即可,当然重复执行也没关系哈,只是覆盖了设置而已。

三、后期维护

做完初始化设置之后,如果想改变备份间隔或者备份目标之类的,你可以编辑系统计划任务,来重新定义:

以上第 4 行则为备份的命令行,以下为后期修改说明:

前 5 列表示执行频率,具体为 分  时 日 月 周,工具默认是定义在【日】这一列,代码中的 */7 表示每 7 天备份一次;

/www/web/default:需要备份的网站文件路径

test2、123456:数据库用户名和密码

/www/backup_temp:备份文件存放地址,每次备份的文件将保留至下一次备份才会被删除,差不多算本地备份了。

mytest :数据库名称

Ps:当然你也可以仿照第 4 行,根据实际需要插入多条任务计划。

四、工具展望

此工具也只是张戈的无聊蛋疼作品,VPS 用户实在不多,而且都有自己的一套备份系统。发这个工具的目的也只是为了给备份网站多一条出路。

视受欢迎程度,下一版工具将加入

①、网站文件/数据库分开备份的自定义机制;

②、做成菜单式,将项目分开设置,包括后期维护的交互式菜单,提高易用性

五、附录:七牛云存储

七牛云存储的介绍:http://zhangge.net/1126.html

七牛云存储推广注册链接:https://portal.qiniu.com/signup?code=3lgiiufrno1ua

就说这么多,需要张戈帮忙部署备份的 VPS 用户,请留言即可!张戈可提供无偿服务!

文件下载

Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

导读:毋庸置疑,数据备份是网站可持续性运营中至关重要的一个工作,如果还没有做任何备份机制的网站,建议尽早完善,莫要等到追悔莫及。本文将分享一个安全稳定、快速可靠、花费廉价的备份方案。

Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

一、优点分析

三叶运维在 2 年前已经分享过一篇关于网站备份的文章:《Linux/vps 本地七天循环备份和七牛远程备份脚本》,今天将再次结合这个脚本,将网站数据通过阿里云内网备份到阿里云 OSS。

对于阿里云 OSS,想必大家都不会陌生,具体功能、特色这里就不赘述了。而利用阿里云 OSS 备份数据的教程方法,网络上已有不少分享,各种开发语言都有,用起来非常方便。

在我看来,用什么语言都是其次,主要还是看重了阿里云 ECS 到阿里云 OSS 可以走内网,相比我之前分享的备份到七牛的方案,速度更快而且流量免费!

我博客之前一直将数据每周一凌晨备份一份到七牛,也不敢每天都备份,因为备份的时候由于服务器上行带宽只有 1M,就算是切片上传也会导致此时网站访问缓慢,影响蜘蛛抓取!所以,当我看到 OSS 可以走内网时,第一个想到的好处就是速度快,不影响服务器公网带宽,对网站的访问毫无影响,超赞!

因此,只建议部署在阿里云 ECS(9 折优惠码:r9itz9,新购可用)的网站使用 OSS 来备份,其他产品还要走外网备份到 OSS 就得不偿失了,还不如用七牛。

二、准备工作

①、开通 OSS,并创建备份 Bucket

访问阿里云 OSS 控制台,点击开通 OSS,然后新建一个 Bucket(名称自定义),注意选择 ECS 相同的区域(比如青岛的 ECS 我就选择华北 1),并且选择私有读写权限:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

②、创建认证密钥

在 OSS 控制台的右侧栏,点击安全令牌,创建用于管理 OSS 的密钥对:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

创建得到的密钥对记得备忘一下,因为只能获取一次:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

2016-10-29 补充:看到倡萌的实践分享,他遇到从 OSS 界面申请的密钥居然不具备 OSS 访问权限,所以这里也“盗图”补充一下,如果密钥没有权限请如图添加即可:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

三、SDK 脚本

我根据 OSS 的帮助文件,选择了适用范围最广的 Python SDK 方案,并且额外加入了断点续传和上传百分比功能,测试成功。

①、环境准备

OSS 的 Python SDK 需要用到 oss2 插件,所以我们先安装一下。

如果服务器上已经安装了 pip 工具,可直接执行如下命令安装 oss2 插件:

若没有,则复制以下命令行到服务器上执行安装:

②、上传脚本

使用方法:将上述代码保存为 oss.upload.py,并上传到服务器,执行如下命令可开始上传文件到 OSS:

其中:

  • 1~2 个参数是认证 ID 和认证密钥就是前文创建并备忘的密钥对。
  • 第 3 个参数是青岛区域的 OSS 内网地址,其他区域请参考OSS 帮助文档,自行选择。
  • 第 4 个参数是前文创建的 Bucket 名称,比如 mybackup1
  • 第 5 个参数是要上传的本地文件的绝对路径

执行后,就能在 OSS 的 Object 界面看到了:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

③、下载脚本

其实只需要有个上传脚本即可,因为备份文件可直接从 Object 界面下载。不过,为了方便在服务器上直接恢复文件,还是弄了一个下载脚本。

使用方法:

将上述代码保存为 oss.download.py,并上传到服务器,执行如下命令就可以下载 OSS 文件到本地:

其中:

  • 1~2 个参数是认证 ID 和认证密钥就是前文创建并备忘的密钥对。
  • 第 3 个参数是青岛区域的 OSS 内网地址,其他区域请参考OSS 帮助文档,自行选择。
  • 第 4 个参数是前文创建的 Bucket 名称,比如 mybackup1
  • 第 5 个参数是存储在 OSS 的文件名称
  • 第 6 个参数是保存到本地的文件绝对路径,若不指定则以相同名称保存到脚本相同目录。

好了,以上只是一个上传和下载的脚本,如果你之前已经有了成熟的备份方案,并且本地存储了备份文件,则可以使用上传脚本,结合 crontab 定时上传到 OSS,如果没有请继续往下看。

四、定时备份

有了上传脚本,就可以结合之前三叶运维分享的七天循环备份脚本,实现循环备份到 OSS 了,既安全还节省 OSS 空间。

Ps:实际上,一个 Python 脚本就可以搞定备份压缩和远程上传 OSS 了,但是之前已经有一个现成的 Shell 备份脚本了,我就懒得重复造轮子了!

①、适合 OSS 的七天循环备份脚本

2016 年 12 月 16 日更新:

1、完善 crontab 环境变量,解决定时执行中因 mysqldump 不存在导致备份文件为空的问题;

2、重写 Shell 脚本,功能没什么变化,也就是看得更顺眼一些。

②、使用方法

将上述代码作如下修改:

I、根据实际情况修改上述代码中的 OSS 上传函数代码,比如密钥对和 Bucket 名称(参考前文)

II、替换代码中的 mypassword 为自己设置的压缩包密码,不修改的话压缩文件解压密码为 mypassword

然后,将代码保存为 backup.sh,上传到服务器(建议存放到和前文 python 脚本的相同目录),比如 /data/backup.sh,最后如下添加定时任务:

本文就不赘述 7 天循环备份脚本的功能和更详细的使用方法了,若还是不清楚请参考前文:Linux/vps 本地七天循环备份和七牛远程备份脚本

全部完成后,就能实现本地 7 天循环备份和 OSS 远程备份了!如果,之前已经做了七牛远程备份的可以放心取消了。

在文章的最后,为了方便广大代码小白朋友,特提供本文涉及脚本的打包下载:

折腾吧,骚年!好用的话,有钱的可以打赏,没钱的欢迎点赞,不怕一万多,不嫌一块少。。。

文件下载

grep无法查找shell传过来的变量?先注意一下文本格式吧!

昨天,同事告诉我发现一个诡异的问题,grep 无法搜索 shell 中的变量,着实很惊讶。到他所说的服务器上试了下,还真是不行!

大概就是这样一个要求:

①、有个文本为 userid.txt,里面每一行一个用户 id,类似如下:

②、另外还有一个文本为 record.txt,里面是所有用户的操作记录,一行一条,并且包含有 id,类似如下:

③、现在他要求循环取出 userid.txt 中每一行 ID 值,然后去 record.txt 去查找并保存结果。

实现这个需求原本很简单,根本难不倒他,只要使用 while read + grep 就能搞定。可问题是明明 record.txt 里面包含这些 id,却无法输出结果??

我顺便写了一个测试脚本测试了下:

发现脚本可以打印 echo $userId,却无法 grep 到??而实际上 record.txt 里面是有这个 id 的!还真诡异!

先百度搜索了一下【grep 无法搜索变量】,还真有不少类似问题,比如:http://bbs.chinaunix.net/thread-123113-1-1.html

根据经验,对于这种诡异的问题,我首先会想到是不是系统有问题,要是系统有问题你怎么折腾都是错!

于是把他的文件拷贝到其他服务器,发现居然可以了!!!难道真是系统问题么?

第一台是 SUSE Linux,第二台是 Centos,难道和系统发行版有关系?

后来,同事在第二台服务器上完成了他的项目。但这个问题却一直留在我的脑子里,挥之不去。


 

今天,我决定再次研究下这个问题,看看是不是有其他原因。我先在那台 SUSE Linux 上,手工编写所需文件:

[root@localhost ~]# vim 1.txt

[root@localhost ~]# vim 2.txt

[root@localhost ~]# vim test.sh

结果,发现居然可以输出结果!证明这系统没有问题啊!于是再一次测试了一下昨天的脚本,发现还是无法输出。

于是使用 -x 参数 调试一下脚本:

先修改脚本代码:

然后,带 -x 参数执行:

难怪找不到,grep 的变量已经变了!0001 变成了 $’0001\r’ !

看到\r,立马想到是文本中的换行符,可为毛会输出换行符呢?想到博客以前写的《Linux 终端:用 cat 命令查看不可见字符》,继续改了一下代码:

执行后恍然大悟:

原来是 dos 下的文本格式,问了下同事,他还真是从 Windows 下导过来的! — —||

也就是说,userid.txt 这个文本的换行符是 Windows 格式,在 Linux 下读取会带有^M。

所以解决上述问题,就很明了了,要么转换 userid.txt 的换行格式,要不就修改代码,去掉多余的字符!

试了下转换格式,发现居然转换不成功,可能是我没找对方法,暂时先不折腾了!

直接如下修改代码,就搞定了:

好了,搞了半天原来是 dos 和 unix 的换行符问题!o(︶︿︶)o 唉!还是经验不足啊!

网上那些问 grep 无法搜索变量的朋友,赶紧看看是不是文本格式造成的!现在,让我很纳闷的是,为毛在另一台 centos 系统可以直接 grep??为什么在 SUSE 系统就不行?

如果和发行版没关系的话,那造成 2 个不同结果的原因就只有一个:在我用 sz+rz 命令将所有文本传送到 centos 的过程中,文件很可能被自动转格式了!好吧,具体就不深究了,有兴趣的可以试试看。

Ghost安装Win7/XP后自动恢复IP的批处理

今天维护人员找的我说,最近要推 Win7 了,暂时桌面云没推广,还是使用手动安装 Win7 的方式。所以,需要我帮忙写一个脚本,大概功能就是在 Ghost Win7 之前先导出 XP 的 IP 信息,在 Ghost 完成之后,自动读取这个 IP 信息用于恢复 IP 设置。

Ghost安装Win7/XP后自动恢复IP的批处理

之前其实写过一个 XP 的,这次是 Win7 的,其实大同小异了,花了近半小时测试成功了,现在来记录一下。

懒得去折腾兼容方法,就写了 2 个导出 IP 的脚本和一个 IP 恢复脚本,用于 Ghost远程安装Win7 后自动恢复 IP 设置的。(繁体环境)

1、导出 WinXP 系统 IP 信息:

2、导出 Win7 系统 IP 信息

Ps:测试过程中,发现 win7 使用 ipconfig 命令,会有个 IPv6 的网关,导致出错,只好用了一个 if 跳出循环。

3、最后输出到D:\ip.txt 的格式如下(太偷懒了,就三行,手动写入也很快!):

最后,通过下面这个脚本读取 d:\IP.txt 内容并恢复 IP:

这个脚本简、繁 WinXP/7 等系统都可以兼容设定 IP,其实是修改自我以前写的Windows 下获取网络连线实际名称,加强 IP 类设置脚本的兼容性中的脚本。

4、脚本用法:

1、封装 Ghost 系统镜像时,将设置 IP 的脚本加入启动项

2、Ghost 安装系统之前先通过【导出脚本】或【手动的方法】在 d 盘建立 ip.txt,写入如上三条信息

3、通过 oneKey 远程恢复 Ghost 系统镜像,等恢复完成之后,IP 脚本自动恢复 D 盘设定好的 IP,这时就可以远程连接电脑进行维护了,整个过程均不需要现场操作。

SEO技巧:Shell脚本自动提交网站404死链到搜索引擎

最近在折腾博客主题,通常来说大多数人认为换主题会影响 SEO,实际上只要你把工作都做到位了,是没有任何问题的。比如,换主题后你得仔细检查标题和描述等内容是否发生改变、换主题后是否带来了大量的 404 页面等。当然,更细微的可能是换主题之后,网站的内链网络也发生了微妙的改变,但是整体的影响较小。

SEO技巧:Shell脚本自动提交网站404死链到搜索引擎

总之,三叶运维这次更换主题基本上没有看到明显的 SEO 影响,反而出现几个新的关键词。好了,题外话到此结束,下面分享一下从 Nginx 日志分析并生成能提交到搜索引擎的死链文件的 Shell 脚本。

一、前因后果

今天在看百度站长平台的抓取频次的时候,发现最近抓取次数有所下滑,并且平均响应时间也有所上升,感觉和最近频繁折腾主题以及访问量增加有所关系:

SEO技巧:Shell脚本自动提交网站404死链到搜索引擎

这个问题倒是好解决,等主题稳定了,页面静态缓存文件也就不会频繁被手工删除,整个网站的抓取响应时间应该就能回到正常水平。

再往下看,却发现网站抓取中出现的 404 数据也呈上升趋势:

SEO技巧:Shell脚本自动提交网站404死链到搜索引擎

实际上,三叶运维以前是手动提交过死链文件的,但后来没时间也就没去搭理更新了。看来这个工作还得重新做起来,并且实现自动化才行了。

二、Shell 脚本

说做就做,简单的写了个 Shell 脚本就搞定了!

脚本名称:网站死链生成脚本

脚本功能:每天定时分析网站前一天的 nginx 日志, 然后提取状态码为 404 并且 UA 为百度蜘蛛的抓取路径,并写入到网站根目录下的 death.txt 文件,用于提交百度死链。

脚本代码

使用说明:

①、脚本适用于每天都做了日志切割的 Nginx,没有做的朋友可以参考博客之前的文章:

nginx 日志切割及 7 天前的历史日志删除脚本

②、将代码保存为 shell 脚本,比如 deathlink.sh,然后如下建立任务计划:

③、执行后,将在网站根目录生成死链文件:death.txt,可以浏览器访问看看内容,比如:

http://zhangge.net/death.txt

④、前往立即前往提交这个死链文件即可:

SEO技巧:Shell脚本自动提交网站404死链到搜索引擎

这样一来,系统会每天执行脚本,将昨天的百度蜘蛛爬到的 404 路径保存到网站根目录下的 death.txt,以备百度死链抓取工具前来抓取。

效果截图:

下面贴上这几天死链抓取(百度定时抓取,无需人工干预)及处理情况,效果还是非常明显的:SEO技巧:Shell脚本自动提交网站404死链到搜索引擎

值得说明的是,这些死链记录是累加的,已保存的死链数据,就算百度蜘蛛不爬了也会继续保存,需要人工清理,不过一般不清理也没啥问题。

注意事项:

①、如果你的 nginx 服务 并没有配置相应的 access 日志,请自行在 server 下添加所需网站的 access 日志,否则脚本无法使用;

②、脚本适用的 access 日志格式如下:

 

如果和你的不一样,则需要修改脚本中的 awk 指定的域(即$9、$15 以及$7)。

三、其他拓展

①、如果你之前没有做过 Nginx 日志切割,那么可以直接用下面这个脚本来一次性搞定:

②、其他 WEB 服务器,比如 Apache 或 IIS,只要参考脚本思路,修改成实际的路径或日志字段,同样可以写一个相同功能的 Shell 或 Batch 脚本,有需求的朋友自己去研究折腾吧!

好了,本文暂时就分享这么多,希望对你有所帮助!

Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点

一开始搭建中国博客联盟,既有博友提醒我,做网址大全这类网站维护很麻烦,需要大量的精力去 Debug 一些已夭折的网站,更是拿松哥的博客大全举例。当然,我也是深以为然。前些时间,看到梦轩丽人的 boke123 网址大全的维护记录,好像是纯手工检查,张戈实在是佩服的五体投地,太有毅力了。

现在博客联盟也收录的博客也已破 200 了,全部来自自主提交,不管你是草博还是名博,张戈不会强买强卖。由于大部分都是建站不过半年的新站,半路放弃、提前太监的博客估计还是有的,于是我决定还是把站点维护这个工作做起来。

上午用 PHP 做了一个放到了京东云试了下,发现检测速度一般,要等上半天(我写的 php 太蹩脚,就不献丑了)。

随后,我在 VPS 上写了一个多线程的网站状态检测脚本,直接从数据库 load 站点地址,然后用 curl 去检测返回码,发现速度非常好,基本 1 分钟内就能出结果

以下是脚本代码:

Ps:关于 shell 多线程脚本,后续文章会有一个详细说明,本文篇幅有限,就不多说了。

以下是中国博客联盟第一次成员站点存活检测的结果:

①、 非 200 返回码的异常站点:

Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点

②、脚本抓取的无法访问站点:

Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点

人工访问筛选结果:

wangyingxue.net(王英学博客):无法访问,经确认处于备案中  √

www.tao0102.com(长江博客):可以访问  √

blog.hack7d.com(Mcdull 技术博客):无法访问  ×

www.1992621.com(教师日记):可以访问  √

www.3miaotu.com(三秒兔):无法访问   ×

xiaoxiaomayi.com(小小蚂蚁博客):可以访问 √

www.awrui.com(李文栋博客):可以访问  √

Ps:脚本检测机制为:8s 内未连通的判定为异常,并重试 3 次,最后输出结果,若三次均异常则为 000。从图中和人工筛选可以看出,存在一些误杀,这个和 8s 的设定有一定关系。可以考虑设置为更长时间,得到更准确的结果,当然最终还是要结合人工确认的,所以也没多大关系。

后续,中国博客联盟会制订一个检查周期,最短每星期检查一次,最长一个月检查一次,争取让每个展示的站点都能正常访问。当然,我也会将每次检查的结果公布在中国博客联盟的站长资讯专栏,方便所有成员查看。

由于目前中国博客联盟部署在京东云擎,无法远程操控数据库,所以只好暂时用半自动的模式。等以后有时间搬到了阿里云等 VPS 上后,将会将脚本改成全自动状态,当有网站联系多次检测为失联状态时,将会暂时将其设置为隐藏状态。