Ubuntu安装和使用supervisor

对于需要以进程的方式常驻在Ubuntu系统中或开机启动的脚本程序,通常使用supervisor进程管理工具进行管理。本文将简单介绍supervisor进程管理工具的安装和使用。
安装

sudo apt-get install supervisor

新建进程配置
安装supervsor进程管理工具后,建议在/etc/supervisor/conf.d/文件夹中为每一个进程创建一个进程配置。

cd /etc/supervisor/conf.d/
sudo touch test.conf


配置详解

[program:test]
command=sh /usr/local/bin/test.sh ;被监控的进程路径
numprocs=1 ; 启动一个进程
directory=/usr/local/bin/ ;执行前切换路径
autostart=true ; 随着supervisord的启动而启动
autorestart=true ; 自动重启
startretries=10 ; 启动失败时的最多重试次数
exitcodes=0 ; 正常退出代码
stopsignal=KILL ; 用来杀死进程的信号
stopwaitsecs=10 ; 发送SIGKILL前的等待时间
redirect_stderr=true ; 重定向stderr到stdout
stdout_logfile=logfile ; 指定日志文件

启动进程

supervisorctl reload
supervisorctl start test

启动进程

supervisorctl start xxx

重启进程

supervisorctl restart xxx

重启所有属于名为group的分组进程

supervisorctl stop group

停止全部进程

supervisorctl stop all

载入最新配置的文件

supervisorctl reload

根据最新的配置文件,启动新配置或有改动的进程

supervisorctl update

frp内网穿透设置

内网有时候快速搭建原型发给用户看的时候,配置服务器很麻烦,未进入生产环境的应用也不敢往正式服务器上放。所以本地的快速访问很是需要和方便。

看了下内网穿透的方式基本上都是属于数据转发,有软件和硬件两种途径。下面我列出主流和我都试用的。硬件都是咸鱼上淘的二手的。

软件有:ngrok、 frp、 花生壳服务端

硬件有:花生壳棒、 花生壳盒子、零遁、汉土、固定IP小魔棒

其中最坑的就是花生壳,首先就是用的它是因为以前TP路由器里经常带着的,想着是个老牌子了也知名。先用了服务端软件方式穿透,用了段时间被封了,理由是我在国外登录了。好吧!写代码的有几个不偶尔VPN去google下呢。忍了!然后一个月过后莫名奇妙没了,一看理由一个月内没有访问流量给删除了。好吧~ 花生壳各种收费模式太多了,基本上每一个点都要收费,强烈建议不要使用!映射也有严格限制。80端口也无法做多域名绑定。一个网站就得占用一条映射。

固定IP模式基本上是用公网IP做了桥接。比较方便,但是80端口需要备案,而且流量也挺贵。

最后还是采用了软件方案比较好点。于是又试用了ngrok和frp。觉得从免费和域名来说,frp还是比较良心的。

服务端配置很简单。

客户端配置web

[web]
type = http
local_port = 80
custom_domains = *.yourdomain.com

这里的custom_domains 类型是 string[] 可以用逗号做多个隔开,也可以用泛域名。

基于php编写桌面应用

如果将一个网站直接打包成一个桌面应用,有很多应用解决方案。比如:electron nwjs(node-webkit) 包括c# delphi等嵌入一个web插件。

但是我们知道要是考虑到h5和css3的支持,还是需要些友好的浏览器内核。而 electron和nwjs都是基于chormium的。

比如我们要将一个SAAS系统打包成一个桌面端软件。系统入口:http://bech.cc/saas/pms

这里介绍nwjs的解决方案。虽然很多人都说electron好, 但是我看到目前国内CocosCreator 、微信开发者工具都是用的nwjs,还有其它很多的软件用它做代理,比如一些数字货币交易所的桌面端软件(win\mac\linux)。

1. 下载nwjs

2. 新建项目文件夹 saas ,在根目录下创建 package.json{
"name": "saastest",
"version": "0.1.0",
"description": "BechTech",
"main": "http://bech.cc/saas/pms/",
"window": {
"width": 1280,
"height": 800,
"position" : "center",
"icon": "./icon.png"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dist": "build --tasks win-x64 --mirror https://npm.taobao.org/mirrors/nwjs/ .",
"start": "run --x64 --mirror https://npm.taobao.org/mirrors/nwjs/ ."
},
"build": {
"nwVersion": "0.46.3",
"win":{
"productName": "BechTech",
"copyright": "Copyright © 2009-2020 BechTech",
"icon": "./favicon.ico"
}
},
"dependencies": {},
"devDependencies": {
"nwjs-builder-phoenix": "^1.15.0"
}
}

3. 将nw.exe的目录放到环境PATH下。切换到目录下

nw saas  //启动查看本地窗口

这里启动后就相当于封装完了软件

4. 打包与发布

这里用官方推荐的 nwjs-builder-phoenix (推荐) 具体方法去git上查看

打包执行命令 npm run dist

后续会生成 dist\saas-0.1.0-win-x64 文件夹

这里要多重复实验才能成功,如果你英文阅读文档功底可以一次就够了。


我们再看另外一种情况,如果你的系统必须局域网内或者vpc访问

其实,这种情况我们经常会碰到,比如为了数据安全 或者考虑到无网环境运行。总之,你需要一个本地服务器。

我们一般的解决方案是配置一个本地的php开发环境。如果集成的会更快如 appserv xmpp phpstudy等等。

但是我们更希望要一个完全的可发布的一体化解决交付方式。

这里我们可以利用php5.5的命令快速实现一个解决方案。然后再用nwjs打包。每一个项目都是一个完美的桌面端软件且运行在本地的localhost.

下载php5.5 win-x86

1. 复制 php.exe php.ini-production ext\ extras\

2. 新建一个www文件夹。这里放的是网站程序 路由入口 index.php( 支持大部分框架 如 TP3)

3. 回到 nwjs 项目根目录下 写一个批处理程序 runserv.bat

@echo off
path = %path%;.\php\;
php.exe -S localhost:8080 -t php\www

4. 写一个main.js 用nodejs 的child_process模块执行批处理脚本

5. package.json 的main 加载 localhost:8080

6. 用nwjs打包

这样一个基于php本地架构的服务方案就完成了。

 

video标签在微信浏览器 X5内核里的一些异常问题

做网站,用视频作为背景 background。是一种广泛的时尚设计。响应式设计下,video标签在微信浏览器里出现全屏浮动播放。加上:x5-video-player-type=”h5″

最终的兼容大部分浏览器的:
(source 里可以加上一些其它兼容格式)

<video autoplay loop muted playsinline x5-video-player-type=”h5″ x5-playsinline=”true”>
<source src=”/static/videos/video.mp4″ type=”video/mp4″>
Your browser does not support the video tag.
</video>

Nodejs+Selenium webdriver自动化测试

  • 安装webdriver

npm install selenium-webdriver –save

  • 安装chrome驱动

npm install chromedriver –save

这里一般会要求科学上网,最好手动去 http://npm.taobao.org/mirrors/chromedriver/ 找到对应版本复制到chrome安装目录下。并设置全局变量。

  • 初始化并打开一个网址

var webdriver = require(‘selenium-webdriver’);
var driver = new webdriver.Builder() .forBrowser(‘chrome’) .build();
driver.get(‘http://www.baidu.com’);