ServerWatchdog

Author Avatar
Tr0y 6月 01, 2017 13:21:11 本文共 811 字
  • 文为知己者书
  • 在其它设备中阅读本文章

Coding 的强制跳转太恶心了,银牌会员审核一直通过不了…Github 又太慢…然而, 如果想部署在自己的服务器上的话, 每次有更新还得 Copy 上去, 很麻烦. 但是, 可以用 Python+坚果云来完成自动部署.

实现功能

  • 在任意电脑打开坚果云(甚至是手机平板), 对 md 增删改查, 服务器检测可以到文件改动, 并自动渲染静态页面.
  • 控制台 log 显示 + log 储存到文件
  • 流程
    • 任意设备, 对 md 增删改查后, 坚果云进行本地增量同步
    • 坚果云增量同步到服务器上
    • watchdog_blog.py 检测到文件变动, 启动 deploy.py
    • deploy.py 执行 hexo g 命令
    • 完成渲染

一些准备工作

  • 由于 Apache 的默认目录是 ./www. 不是 Hexo 的 public 目录, 所以还得把渲染后位于 public 目录下的文件拷到 www 下, 很麻烦.
  • 所以, 找到 Apache 目录下的 ../httpd.conf 文件, 打开 httpd.conf, 将 .\www 这种形式的目录均改为 public 目录. 如 DocumentRoot "(博客根目录)/public/".
  • 在服务器上下载坚果云
  • 添加博客的 public 文件夹为坚果云的同步文件夹
  • 本地下载坚果云, 把坚果云中的 public 放在博客根目录下覆盖原来的 public
  • 博客根目录下新建一个 watchdog.log, 用于存放 log.
  • watchdog_blog.pydeploy.py 均放在博客根目录下.
  • 如果没有装 watchdog 这个库, 先装一下 pip install watchdog

代码

  • watchdog_blog.py
# -*- coding: cp936 -*-
import time
import logging
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
from watchdog.observers.api import ObservedWatch
import os
import subprocess

class MyHandler(FileSystemEventHandler):
    def on_any_event(self, event):
        global lognum
        subprocess.call('pythonw deploy.py', shell=True)
        lognum += 1

lognum = 0
event_handler1 = MyHandler()
observer = Observer()
watch = observer.schedule(event_handler1, path = './source/', recursive = True)

logging.basicConfig(level = logging.INFO, format = '%(asctime)s - %(message)s', datefmt = '%Y-%m-%d %H:%M:%S', filename = 'watchdog.log', filemode='a')

console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s: %(levelname)s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

event_handler2 = LoggingEventHandler()
observer.add_handler_for_watch(event_handler2, watch)      #为 watch 新添加一个 event handler
observer.start()
try:
    while True:
        time.sleep(1)
        if lognum > 20:
            os.system('cls')
            lognum = 0
except KeyboardInterrupt:
    observer.stop()
observer.join()
  • deploy.py
import os
os.system('hexo g')

搞定

  • 突然发现, 这个自带的跳转可以防止部分瓜皮爬虫…所以我又回到 Coding 了.
  • 启动坚果云, 双击 watchdog_blog.py. 安心写博客去咯~
  • 坚果云有每月限制流量, 不过我觉得写写文章共用了.
  • 如果设置之类的也想同步, 把整个博客目录作为同步文件夹就行, 不过要小心死循环.
  • 这是不是可以叫做云渲染?
  • 如果想监视多个目录…
# -*- coding: cp936 -*-
import time
import logging
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
from watchdog.observers.api import ObservedWatch
import os
import subprocess

class MyHandler(FileSystemEventHandler):
    def on_any_event(self, event):
        global lognum
        subprocess.call('pythonw deploy.py', shell=True)
        lognum += 1

lognum = 0
event_handler1 = MyHandler()
event_handler2 = MyHandler()

observer = Observer()
watch = observer.schedule(event_handler1, path = './source/', recursive = True)
watch = observer.schedule(event_handler2, path = './themes/', recursive = True)

logging.basicConfig(level = logging.INFO, format = '%(asctime)s - %(message)s', datefmt = '%Y-%m-%d %H:%M:%S')
event_handler2 = LoggingEventHandler()#
observer.add_handler_for_watch(event_handler2, watch)

observer.start()
try:
    while True:
        time.sleep(1)
        if lognum > 20:
            os.system('cls')
            lognum = 0
except KeyboardInterrupt:
    observer.stop()
observer.join()

End

What do you think?

本文标题: ServerWatchdog
原始链接: http://www.tr0y.wang/2017/06/01/ServerWatchdog/
发布时间: 2017.06.01-13:21
最后更新: 2018.11.03-20:59
版权声明: 本站文章均采用CC BY-NC-SA 4.0协议进行许可。转载请注明出处!