Mapz's Blog

可以递归的函数指针

原文地址 Mapz的Blog

前言

跑着的进程被系统杀啦?OOM?CPU爆了?一个稳定的系统环境需要一个进程监控工具,supervisor是一款基于Pyhton的进程监控工具,这次我们来学习使用之。

官方文档点我

安装

用pip安装的话,python3上现在还没有可用的安装包(貌似)

所以我们用虚拟环境搭载python2.7安装supervisor

假设我们已经安装好了Python的虚拟环境工具 virturlenv

在你合适的目录下

1
2
3
virtualenv --python=python2.7 ./supervisor_env
source supervisor_env/bin/activat
pip install supervisor

安装完成!

使用

1
echo_supervisord_conf

这个可以显示supervisor的默认配置项目

我们把这些配置导入一个文件

1
echo_supervisord_conf > ./supervisord.conf

然后使用 supervisord -c 配置文件路径 就可以启动了
如果不用-c参数则会按下列顺序来查找配置

$CWD/supervisord.conf, $CWD/etc/supervisord.conf, /etc/supervisord.conf

所以我们的启动命令为

1
supervisord -c ./supervisord.conf

配置

配置include文件内容

我们可以把所有的配置项目都写入到 supervisord.conf 里面,但是这样显然不方便管理,我们最好把监控不同程序的配置分别写成配置文件,然后在supervisord.conf中来引用他们

新建一个目录来存储我们的各目录配置

1
mkdir process_config

编辑supervisord.conf,最下方include注释解开,改为

1
2
[include]
files = process_config/*.conf

配置程序监控

以我机器上经常因为OOM而挂掉的elasticsearch为例,我们来写一份配置

我们的安装路径位于

~/Downloads/elasticsearch-5.2.2/bin

所以这个进程启动命令应该是

1
~/Downloads/elasticsearch-5.2.2/bin/elasticsearch

我们在 process_config 目录下创建新配置文件 elasticsearch.conf

1
2
cd process_config
touch elasticsearch.conf

编辑之

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[program:elasticsearch]
directory = ~/Downloads/elasticsearch-5.2.2/bin/ ; 程序的启动目录
command = elasticsearch ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = MapzChen ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = ./logs/usercenter_stdout.log ;目录要存在哦

; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere

管理

supervisor 自带了Shell管理工具 supervisorctl

运行方式和运行supervisor一致

1
supervisorctl -c ./supervisord.conf

运行后进入shell

1
2
3
4
5
6
> status    # 查看程序状态
> stop usercenter # 关闭 usercenter 程序
> start usercenter # 启动 usercenter 程序
> restart usercenter # 重启 usercenter 程序
> reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
> update # 重启配置文件修改过的程序

实战

运行 supervisor 后老出错找不到elasticsearch,然后路径什么的配置的并没有问题呀

网上找了个办法,使用一个bash文件来打开elas,然后supervisor中配置这个bash文件

创建程序的启动脚本

创建一个脚本来启动elas,并加入权限

1
2
3
mkdir bashs
touch bashs/elasticsearch.sh
chmod bashs/elasticsearch.sh

编辑 bashs/elasticsearch.sh

1
2
#!/bin/bash  
/Users/mapzchen/Downloads/elasticsearch-5.2.2/bin/elasticsearch

重新配置 elasticsearch.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[program:elasticsearch]
directory = /Volumes/store/py_apps/supervisor/bashs ; 程序的启动目录
command = /Volumes/store/py_apps/supervisor/bashs/elasticsearch.sh ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = mapzchen ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = ./logs/usercenter_stdout.log ;目录要存在哦

; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere

启动,检查状态

1
elasticsearch                    RUNNING   pid 35058, uptime 0:06:11

已经启动成功啦~~

前言

我们做爬虫的的时候,经常会遇到页面中的部分是由js生成并渲染的情况,这时爬虫爬到的页面还并非呈现在用户面前的页面,要得到需要的内容,可以用大招…还是用浏览器核心来渲染一遍

我准备尝试用PhantomJs–基于Webkit的服务端JS API(说大白话点,就是个隐形的浏览器,并且这货还提供了文件处理的IO操作)用来帮我们处理爬虫爬到的页面的渲染工作。


安装PhantomJS

下载地址
这个是已经编译好的

不要用npm装,不然会不能正常运行

下载后解压后把目录下的bin路径加入PATH中就可以了

1
phantomjs --version

如果不报错,则已经安装好了


番外:想要安装HomeBrew

那就这么安吧

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

Scrapy安装

(假设你已经懂Scrapy怎么玩)


安装selenium

selenium支持在Python中使用多种浏览器来模拟行为,同样PhantomJS也不在话下

1
sudo pip install selenium

使用

Scrapy中间件增加一个

1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver
import time
from scrapy.http import HtmlResponse
class JSProcessMiddleware(object):
def process_request(self, request, spider):
driver = webdriver.PhantomJS(executable_path = '你的phantomjs安装路径')
driver.get(request.url)
time.sleep(1)
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js) # 可执行js,模仿用户操作。此处为将页面拉至最底端。
time.sleep(3)
body = driver.page_source
return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)

如果不想在所有爬虫中使用,可以在reqeust中加meta参数来控制

我们在做版本控制的时候,需要去除本地的一些IDE信息

这里介绍一下在使用__JetBrain__系列IDE(__IntelliJ,PyCharm__等)时,如何在__Git__上忽略IDE工程信息


  1. 编辑项目下的.gitignore文件,添加
    1
    .idea/
  2. 执行命令
    1
    2
    3
    git rm -r --cached .
    git add .
    git commit -m "fixed untracked files"

~~Done

本地调试WordPress需要用ftp来安装插件,所以我们需要开启Ftp服务

一个命令解决

1
sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist

然后ftp的用户名密码,就是登陆mac os的用户和密码

WP Editer.MD

是一个在wordPress上编辑markdown的工具

下载插件后,安装到 /wp-content/plugins/插件名 目录下,然后再wordPress控制台中设置

Jetpack

或者Simpack

是一个插件包,其中有对于markdown的支持

安装方式同上

总览


WordPress是一款使用广泛的博客系统,为了学习和验证其是否符合我们的需求,我将会在我的Macbook上安装之

WordPress需求:

  1. PHP 5.2.4或更高版本
  2. MySQL 5.0或更高版本

安装PHP


其实Mac上是内置了PHP的,但是版本可能不满足大家的需要

如果说出现问题,我们可以使用一个神奇的命令来安装你需要的php版本,而不是走一般的安装方式

1
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6

后面的参数替换为你需要的版本号即可

安装MySQL


官网下载区

MySQL Community Server

选择你的版本来下载安装即可
安装时会生成临时密码

2017-04-24T03:36:10.495551Z 1 [Note] A temporary password is generated for root@localhost: f)a=u!Jl2s-U
If you lose this password, please consult the section How to Reset the Root Password in the MySQL reference manual.

请记住这个临时密码

为了方便操作mysql我们再下载一个mysql workbench 作为管理工具

安装wordpress


wordpress中文网站下载

然后移步安装文档

下载后解压至某目录,然后编辑apache2的httpd.conf配置此目录到apache服务器下

例如

1
2
3
4
5
6
7
Alias /wordpress "/Volumes/store/wordpress/wordpress"
<Directory "/Volumes/store/wordpress/wordpress">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

浏览器打开 http://localhost/wordpress 可以看到wordpress欢迎界面

配置wordpress


按照欢迎页面的提示,我们准备好以下信息:

  1. 数据库名
  2. 数据库用户名
  3. 数据库密码
  4. 数据库主机
  5. 数据表前缀(table prefix,特别是当您要在一个数据库中安装多个WordPress时)

启动mysql

在__系统偏好设置__中找到__mySql__然后点击__Start MySql Server__

我们打开mysql workbench创建一个localhost的连接

第一次登录会让我们修改密码,然后老密码写入上面那个临时密码,登入服务器

使用 new schema 创建新库

Users and Privileges 创建新用户 , 并加入权限

使用wordpress欢迎页面配置

点击欢迎页面下一步,把刚创建的数据库和用户填入后提交

如果报错,请按提示进行

最后输入站点信息,DONE!

我们在hexo中新建一篇文章使用的命令是:

1
hexo new  "新文章"

在执行这个命令的时候,其实是触发了 hexo.on 这个回调的,那么怎样在新建时打开编辑器就很简单了

1
2
3
4
var spawn = require('child_process').spawn;
hexo.on('new', function(data){
spawn('start "markdown编辑器绝对路径.exe" ' + data.path);
});