Jim

Talk is cheap. Show me the code.


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 搜索

Python Plumbum 简介(翻译)

发表于 2018-03-19 | 分类于 翻译

说明:本文翻译自 Plumbum 官网主页,对少量不太重要的内容进行了缩减。

Plumbum:Shell 组合器


你是否曾希望将 shell 脚本紧凑地融入到真正的编程语言里面?向 Plumbum Shell Combinators 问好。Plumbum (lead 的拉丁语,以前用来制作管道)是一个小型但功能丰富的 Python 类 shell 脚本程序库。该库的理念是 “永远不要再写 shell 脚本”,因此它试图合理地模仿 shell 语法(shell 组合器),同时保持 Python 特性和跨平台。

除了类似 shell 的语法和便捷的快捷方式之外,该库还提供本地和远程命令执行(通过 SSH)、本地和远程文件系统路径、简单的工作目录和环境操作、快捷访问 ANSI 颜色,以及编程命令行接口(CLI)应用程序工具包。现在让我们看一些代码!

新闻


略。。。

备忘录


基本使用
1
2
3
4
5
6
7
8
9
>>> from plumbum import local
>>> ls = local["ls"]
>>> ls
LocalCommand(<LocalPath /bin/ls>)
>>> ls()
u'build.py\ndist\ndocs\nLICENSE\nplumbum\nREADME.rst\nsetup.py\ntests\ntodo.txt\n'
>>> notepad = local["c:\\windows\\notepad.exe"]
>>> notepad() # Notepad window pops up
u'' # Notepad window is closed by user, command returns

不需要为每个你想使用的命令写 xxx = local["xxx"],你可以导入命令行:

1
2
3
>>> from plumbum.cmd import grep, wc, cat, head
>>> grep
LocalCommand(<LocalPath /bin/grep>)

见本地命令行 。

管道
1
2
3
4
5
>>> chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]
>>> print chain
/bin/ls -a | /bin/grep -v '\.py' | /usr/bin/wc -l
>>> chain()
u'13\n'

见管道。

重定向
1
2
3
4
5
6
>>> ((cat < "setup.py") | head["-n", 4])()
u'#!/usr/bin/env python\nimport os\n\ntry:\n'
>>> (ls["-a"] > "file.list")()
u''
>>> (cat["file.list"] | wc["-l"])()
u'17\n'

见输入/输出重定向。

工作目录操作
1
2
3
4
5
6
>>> local.cwd
<Workdir /home/tomer/workspace/plumbum>
>>> with local.cwd(local.cwd / "docs"):
... chain()
...
u'15\n'

见路径和本地对象 。

前台后和后台执行
1
2
3
4
5
6
7
>>> from plumbum import FG, BG
>>> (ls["-a"] | grep["\\.py"]) & FG # The output is printed to stdout directly
build.py
.pydevproject
setup.py
>>> (ls["-a"] | grep["\\.py"]) & BG # The process runs "in the background"
<Future ['/bin/grep', '\\.py'] (running)>

见前台和后台。

命令行嵌套
1
2
3
4
5
6
>>> from plumbum.cmd import sudo
>>> print sudo[ifconfig["-a"]]
/usr/bin/sudo /sbin/ifconfig -a
>>> (sudo[ifconfig["-a"]] | grep["-i", "loop"]) & FG
lo Link encap:Local Loopback
UP LOOPBACK RUNNING MTU:16436 Metric:1

见命令行嵌套。

远程命令(通过 SSH)
1
2
3
4
5
6
7
>>> from plumbum import SshMachine
>>> remote = SshMachine("somehost", user = "john", keyfile = "/path/to/idrsa")
>>> r_ls = remote["ls"]
>>> with remote.cwd("/lib"):
... (r_ls | grep["0.so.0"])()
...
u'libusb-1.0.so.0\nlibusb-1.0.so.0.0.0\n'

见远程。

CLI 应用程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import logging
from plumbum import cli

class MyCompiler(cli.Application):
verbose = cli.Flag(["-v", "--verbose"], help = "Enable verbose mode")
include_dirs = cli.SwitchAttr("-I", list = True, help = "Specify include directories")

@cli.switch("-loglevel", int)
def set_log_level(self, level):
"""Sets the log-level of the logger"""
logging.root.setLevel(level)

def main(self, *srcfiles):
print "Verbose:", self.verbose
print "Include dirs:", self.include_dirs
print "Compiling:", srcfiles

if __name__ == "__main__":
MyCompiler.run()

输出样例

1
2
3
4
$ python simple_cli.py -v -I foo/bar -Ispam/eggs x.cpp y.cpp z.cpp
Verbose: True
Include dirs: ['foo/bar', 'spam/eggs']
Compiling: ('x.cpp', 'y.cpp', 'z.cpp')

见命令行应用程序。

颜色和风格
1
2
3
4
5
6
7
8
9
from plumbum import colors
with colors.red:
print("This library provides safe, flexible color access.")
print(colors.bold | "(and styles in general)", "are easy!")
print("The simple 16 colors or",
colors.orchid & colors.underline | '256 named colors,',
colors.rgb(18, 146, 64) | "or full rgb colors" ,
'can be used.')
print("Unsafe " + colors.bg.dark_khaki + "color access" + colors.bg.reset + " is available too.")

输出样例

1
2
3
4
This library provides safe color access.
Color (and styles in general) are easy!
The simple 16 colors, 256 named colors, or full hex colors can be used.
Unsafe color access is available too.

见颜色。

开发和安装


该库在 Github 上开发,非常乐意接受来自用户的补丁。请使用 GitHub 的内置 issue 跟踪器报告您遇到的任何问题或提出功能上的需求。该库在 IMIT 许可下发布。

要求

Plumbum 支持 Python 2.6-3.6 和 PyPy,并且通过 Travis CI 和 Appveyor 持续地在 Linux,Mac 和 Windows 机器上测试。Plumbum 在任何类 Unix 的机器都应该可以正常工作,除了 Windows,你也许需要安装一个合适的 coreutils 环境并把其加入到你的PATH环境变量中。我推荐 mingw(与 Windows Git 捆绑在一起),但是 cygwin 应该也可以。如果你仅仅是使用 Plumbum 代替 Popen 来运行 Windows 程序,那么就不需要 Unix 工具了。
注意远程命令的执行,需要一个 openSHH 兼容的客户端(同样与 Windows Git 捆绑在一起)和一个 bash 兼容的 shell,也需要在主机上有一个 coreutils 环境。

下载

你可以在 Python Package Index (多种格式)下载该库,或者直接运行 pip install plumbum。如果你使用 Anaconda,你可以使用 conda install -c conda-forge plumbum 从 conda-forge 通道获取。

用户指南


用户指南涵盖了 Plumbum 大部分功能,拥有大量的代码片段,你可以不用花多少时间即可开始使用。该指南逐渐介绍概念和”语法”,因此推荐你按照顺序阅读。一个有效的快速参考指南。
略。。。

API 参考


API 参考(在库中通过 docstrings 生成的)涵盖了所有暴露的 API。注意,一些“高级的”功能和一些函数参数在用户指南中没有,因此在这种情况下你也许需要参考下 API 文档。
略。。。

关于


Plumburn 最初的目的是让本地和远程程序轻松地执行,假设没有比老的 ssh 更时髦的东西了。在此基础上,设计了一个文件系统抽象层,以便能够无缝地处理本地和远程文件。
我有这个想法一段时间了,直到我必须要个给我当前工作的项目写一个构建脚本,我决定使用 shell 脚本,现在是实现它的时候了。Plumbum 诞生自 Path 类的片段和我为 RPyC 写的 SshContext 和 SshTunnel 类。Path 类是我为前面说的构建系统写的。当我将两者与 shell 组合器(因为 shell 脚本在这里确实有优势)组合在一起时,奇迹就发生了,便产生了Plumbun。

赞扬


该项目受到了 Andrew Moffat 的 PBS(现在被称作 sh)启发,并且借用了他的一些思想(即像函数一样看待程序,导入命令行的技巧)。然而我感觉在 PBS 中有太多的魔力在继续,当我编写类 shell 程序时,语法不是我想要的。关于这个问题我联系了 Andrew,但是他想让 PBS 保持这种状态。除此之外,两个库走不同的方向,Plumbum 试图提供一种更合理的方法。
Plumbum 也向 Rotem Yaari 致敬,他为特定的目的建议了一个代号为 pyplatform 的库,但是从未实现过。

shadowsocks 使用

发表于 2018-03-18 | 分类于 vpn

安装

https://github.com/shadowsocks/shadowsocks/blob/master/README.md

命令行启动

  • 前台启动
    sudo ssserver -p 443 -k password -m aes-256-cfb
  • 后台启动
    sudo ssserver -p 443 -k password -m aes-256-cfb -d start
  • 停止
    sudo ssserver -d stop
  • 查看日志
    sudo less /var/log/shadowsocks.log

使用配置文件启动(墙裂推荐该方式)

  • 前台启动:
    sudo ssserver -c /etc/shadowsocks.json

  • 后台启动:
    sudo ssserver -c /etc/shadowsocks.json -d start

  • 停止服务:
    sudo ssserver -c /etc/shadowsocks.json -d stop

shadowsocks.json 配置文件格式

配置文件示例(单服务器多账号配置):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"server":"0.0.0.0",
"local_address": "127.0.0.1",
"local_port:":1080,
"port_password":{
"1851":"xxxx",
"1852":"xxxx",
"1853":"xxxx",
"1854":"xxxx",
"1855":"xxxx",
"1856":"xxxx"
},
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}

故障排查

如果 shadowsocks.json 配置文件中 server 字段配成公网IP,而不是 0.0.0.0,会报如下错误:

socket.error: [Errno 99] Cannot assign requested address

我的 Mac 终端配置(Mac OSX + iTerm2 + Zsh + Oh-My-Zsh)

发表于 2018-03-18 | 分类于 Mac

相关工具介绍

  1. iTerm2:Mac 下 Terminal 终端的替代品,拥有更多强大的功能,想了解更多请戳 iTerm2 官网;
  2. zsh:Linux 的一种 shell 外壳,和 bash 属于同类产品;
  3. Oh-My-Zsh:用来管理 zsh 的配置,同时还有很多社区贡献的主题配置以及好用的插件可供使用,了解更多请戳 Oh-My-Zsh 官网 ;

配置方案总览

  1. iTerm2 终端工具;
  2. iTerm2 Solarized Dark Higher Contrast 配色方案;
  3. Monaco for Powerline 字体;
  4. zsh (Mac 系统自带,无需安装);
  5. Oh-My-Zsh;
  6. Oh-My-Zsh powerlevel9k 主题;

最终效果:
z-mac-terminal-config-sample1
z-mac-terminal-config-sample2
z-mac-terminal-config-sample3

具体配置步骤

1. 安装 iTerm2 终端工具:

打开 iTerm2 官网 直接点击 Download 下载并安装即可。

2. 安装 iTerm2 Solarized Dark Higher Contrast 配色方案:

将该配色方案文件(Solarized Dark Higher Contrast.itermcolors)复制出来,保存到本地,文件命名为 SolarizedDarkHigherContrast.itermcolors ,然后双击即可安装。安装完后打开 iTerm2 终端,依次选择菜单栏:iTerm2 –> Preferences –> Profiles –> Colors –> Colors Presets –> SolarizedDarkHigherContrast,至此 iTerm2 Solarized Dark Higher Contrast 配色方案已成功安装。

3. 安装 Monaco for Powerline 字体:

将该仓库克隆到本地,然后进入工程目录的 Monaco 目录,双击后缀名为 .otf 的字体文件即可完成该字体的安装。安装该字体的原因主要是为了和 Oh-My-Zsh 的 powerlevel9k 主题相兼容,如果不安装该字体,那么后面安装 powerlevel9kn 主题后会出现乱码。

1
2
# 该仓库中包含好几种优化后的字体
git clone https://github.com/supermarin/powerline-fonts.git

4. 安装配置 zsh:

zsh 一般 Mac 已经自带了,无需额外安装。可以用 cat /etc/shells 查看 zsh 是否安装,如果列出了 /bin/zsh 则表明 zsh 已经安装了。
接下来修改 iTerm2 终端的默认 Shell,可以用 echo $SHELL 查看当前 Shell 是什么,如果不是 /bin/zsh 则用如下命令修改 iTerm2 的默认 Shell 为 zsh:

1
chsh -s /bin/zsh

5. 安装 Oh-My-Zsh:
1
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
6. 安装配置 Oh-My-Zsh powerlevel9k 主题:
  • 克隆该仓库到 oh-my-zsh 用户自定义主题目录

    1
    git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
  • 修改 ~/.zshrc 配置文件,配置该主题

    1
    ZSH_THEME="powerlevel9k/powerlevel9k"
  • 修改命令提示符
    默认的命令提示符为 user@userdemackbookPro,这样的提示符配合 powerlevel9k 主题太过冗长,因此我选择将该冗长的提示符去掉,在 ~/.zshrc 配置文件后面追加如下内容:

    1
    2
    # 注意:DEFAULT_USER 的值必须要是系统用户名才能生效
    DEFAULT_USER="user"
  • 简单定制下 powerlevel9k 主题
    powerlevel9k 主题的好处就是可以做很多自定义,只需要简单修改 ~/.zshrc 配置即可生效。更多关于该主题的定制请看 customizing-prompt-segments;
    默认的 powerlevel9k 主题最右侧显示的元素为:每条命令的执行状态,历史命令条数,当前时间,这样也比较冗余,我在这里将 历史命令条数 这一元素去掉,这样看起来比较简洁。这需要修改 ~/.zshrc 配置文件,在后面追加如下内容,定制该主题的显示元素:

    1
    2
    3
    4
    # 设置 oh-my-zsh powerlevel9k 主题左边元素显示
    POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir rbenv vcs)
    # 设置 oh-my-zsh powerlevel9k 主题右边元素显示
    POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs time)
7. 配置 zsh 命令语法高亮

zsh-syntax-highlighting 插件可以使你终端输入的命令有语法高亮效果,安装方法如下(oh-my-zsh 插件管理的方式安装):
1.Clone this repository in oh-my-zsh’s plugins directory:

1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

2.Activate the plugin in ~/.zshrc:

1
2
# 注意:zsh-syntax-highlighting 必须放在最后面(官方推荐)
plugins=( [plugins...] zsh-syntax-highlighting)

3.Source ~/.zshrc to take changes into account:

1
source ~/.zshrc

8. 安装一些比较实用的 oh-my-zsh 插件

关于 oh-my-zsh 插件的管理是很简单的,有两个插件目录:

  • /Users/user/.oh-my-zsh/plugins: oh-my-zsh 官方插件目录,该目录已经预装了很多实用的插件,只不过没激活而已;
  • /Users/user/.oh-my-zsh/custom/plugins: oh-my-zsh 第三方插件目录;

需要安装哪个插件,只需要把插件下载到上面任何一个目录即可,然后在 ~/.zshrc 配置文件中的 plugins 变量中添加对应插件的名称即可,以下是我挑选的几个比较好用的插件(都是官方自带的,无需另外下载),~/.zshrc 配置文件如下:

1
2
3
4
5
6
7
# Add wisely, as too many plugins slow down shell startup.
plugins=(
git
extract
z
zsh-syntax-highlighting
)

  • git:oh-my-zsh 默认开启的,没什么好说的;
  • extract:通用的解压缩插件,可以解压缩任何后缀的压缩文件,使用方法很简单:x 文件名;
  • z:很智能的目录跳转插件,能记录之前 cd 过哪些目录,然后模糊匹配跳转,不需要输入全路径即可跳转,使用方法:z dir_pattern

Markdown 页面内跳转

发表于 2018-03-18 | 分类于 Markdown

Markdonwn 页面内跳转

问题描述

有时候在 Markdown 中需要点击某个链接,然后跳转到当前页面内的其他地方,而不是跳转到一个URL链接,这个在 Markdown 是可以实现的。

解决问题

1.使用 html 标签定义一个锚(id),将需要跳转的内容使用该标签包起来:

1
2
3
4
# id 可以随便定义,只要同一页面内保证唯一即可
<span id="1">
要跳转的内容(在这里可以写任意内容,MD 格式的也可以)
</span>

2.后在页面内超链接到指定锚(id)上:

1
[链接文本](#1)

举例:
~/.ssh/config GitHub Host配置
点击上面链接即可跳转到该页面中链接的代码块。

1
2
3
4
Host github
HostName github.com
User git
IdentityFile ~/.ssh/my_github_key

GitHub多账号密钥配置

发表于 2018-02-19 | 分类于 Git

GitHub多账号密钥配置

问题描述

之前在自己的GitHub账号配置过本地电脑的ssh key,然后用同样的ssh key给另外一个GitHub账号配置密钥,发现报如下错误:

其实这个问题的原因很简单,主要是GitHub账号和服务器通信的ssh密钥对是一一对应的,不允许多个账号使用同样的密钥对,否则会出现歧义,需要为每个账号配置不同的密钥对。

解决方法

  1. 为每个GitHub账号单独生成ssh密钥对:

    1
    2
    ssh-keygen -t rsa -f github1 -C "abc@gmail.com"
    ssh-keygen -t rsa -f github2 -C "def@gmail.com"
  2. 把生成的公钥分别添加到GitHub账号管理后台:

  3. 编辑~/.ssh/config文件添加如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 其中Host是主机别名,HostName是github服务器地址,User是GitHub服务器用户名,
    # IdentityFile是和GitHub服务器通信的ssh私钥,通过IdentityFile就可以区分出
    # 不同的账号。
    Host account1
    HostName github.com
    User git
    IdentityFile ~/.ssh/github1
    Host account2
    HostName github.com
    User git
    IdentityFile ~/.ssh/github2
  4. 使用ssh-agent管理生成的私钥:

    1
    2
    ssh-add github1
    ssh-add github2
  5. 在使用git clone时将GitHub SSH仓库地址中的git@github.com替换成第三步新建的Host别名account1或account2(仓库属于哪个Host则使用哪个,这里假设仓库属于account1,GitHub账号的区分是通过在GitHub管理后台添加的公钥来辨识)。如原地址是:git@github.com:qianghaohao/TranslateProject.git 替换后应该是:account1:qianghaohao/TranslateProject.git 如果是新建的仓库,直接使用替换后的URL克隆即可。如果已经使用原地址克隆过了,可以使用命令修改远程仓库地址:

    1
    git remote set-url origin account1:qianghaohao/TranslateProject.git

参考文章

http://blog.csdn.net/u010387196/article/details/41266255
http://happy123.me/blog/2014/12/07/duo-ge-gitzhang-hao-zhi-jian-de-qie-huan

Zabbix通过进程名监控进程状态配置详解

发表于 2018-02-18 | 分类于 Zabbix

有时候我们只能通过进程名监控一个进程是否停掉了,因为有的进程并没有对外提供端口号,以下记录了下详细步骤,通过这个示例会学到很多zabbix核心配置相关的东西。
总的来说,配置一个完整的监控流程如下:

  1. 创建监控项,即配置要监控的指标,如内存的使用率,CPU的使用率,进程的运行状况等,配了监控项后就会定时收集机器的配置信息,然后等待zabbix server收集(zabbix agent被动模式)。
  2. 创建触发器,触发器将监控项收集的数据通过触发器表达式进行评估。
    在触发器表达式中我们可以定义哪些值范围是合理,哪些是不合理的,如果出现不合理的值,触发器会把状态改为PROBLEM,接下来就到了报警以及发邮件。
  3. 创建动作,在zabbix中动作的意思是触发器触发后要进行的操作,一般是通过配置给相关负责人发送邮件,短信等通知。

下面配置监控服务器的logstash(开源实时日志同步项目)进程是否在运行:

  1. 首先创建监控进程的监控项:
    监控项的组成:key[参数]

    例如获取5分钟的负载情况:system.cpu.load[avg5],avg5是对应的参数。
    zabbix agent支持的所有key可以到这里找到:
    http://www.ttlsa.com/zabbix/zabbix-agent-types-and-all-keys/
    在这里我们需要的是proc.num这个key,以下是对此key的详解:

    可以看到此监控项的返回值是进程数量,其中cmdline参数可以是进程名字包含的关键字,在这里我的进程的关键字是logstash,因此按如下方式创建监控logstash进程的监控项,表示机器所有用户所有状态的logstash进程数量:

  2. 创建对应监控项的触发器:
    创建触发器主要是编写触发器表达式,也就是评估监控项是否在合理范围的表达式。触发器表达式格式如下:
    host:key[param].function(parameter)} operator constant
    主机:监控项.函数(参数)} 表达式 常数

    对于触发器表达式更加详细的介绍请参考这里:
    http://www.ttlsa.com/zabbix/zabbix-trigger-expression/
    触发器表达式示例:
    触发器名称:Processor load is too high on www.zabbix.com
    {www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5
    触发器说明:
    www.zabbix.com:host名称
    system.cpu.load[all,avg1]:item值,一分内cpu平均负载值
    last(0):最新值
    >5:最新值大于5
    如上所示,www.zabbix.com这个主机的监控项,最新的CPU负载值如果大于5,那么表达式会返回true,这样一来触发器状态就改变为“problem”了。
    在这里针对logstash进程触发器配置如下:

    上面配置表示如果机器logstash进程数量的最新值小于1,就会触发报警。

  3. 配置动作发送短信和邮件报警:
    以下是短信配置方式,邮件配置类似,其中应用集是自己创建的,主要用来分类,具体的自行研究:

参考文章:
zabbix item key详解
zabbix agent 类型所有key
zabbix触发器表达式详解

Linux下文件的三个时间戳:atime,mtime,ctime

发表于 2018-02-18 | 分类于 Linux

在linux系统下每个文件都有三个时间戳,分别为atime,mtime,ctime,具体解释如下:

  • atime(access time):最近访问内容的时间
  • mtime(modify time):最近修改内容的时间
  • ctime(change time):最近更改文件的时间,包括文件名、大小、内容、权限、属主、属组等。

查看一个文件的这三个时间戳可以用stat命令:

1
2
3
4
5
6
7
8
9
[haohao@localhost test]$ stat file_timestamp 
File: 'file_timestamp'
Size: 12 Blocks: 8 IO Block: 4096 regular file
Device: 100f5c8h/16840136d Inode: 97910802 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ haohao) Gid: ( 1000/ haohao)
Access: 2017-05-21 11:11:48.882598473 +0800
Modify: 2017-05-21 11:11:48.882598473 +0800
Change: 2017-05-21 11:11:48.882598473 +0800
Birth: -

查看文件可以更改文件的atime,比如cat,more,less一个文件后,文件的atime会更新,还是上面示例文件:

1
2
3
4
5
6
7
8
9
10
11
[haohao@localhost test]$ cat file_timestamp 
hello,world
[haohao@localhost test]$ stat file_timestamp
File: 'file_timestamp'
Size: 12 Blocks: 8 IO Block: 4096 regular file
Device: 100f5c8h/16840136d Inode: 97910802 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ haohao) Gid: ( 1000/ haohao)
Access: 2017-05-21 11:14:09.815598462 +0800
Modify: 2017-05-21 11:11:48.882598473 +0800
Change: 2017-05-21 11:11:48.882598473 +0800
Birth: -

可以看出文件的atime已经更新成最新的了。
更改文件的内容会同时更新文件的mtime和ctime,还是上面的示例文件,改变文件内容,然后stat查看:

1
2
3
4
5
6
7
8
9
10
[haohao@localhost test]$ echo "RNG" >> file_timestamp 
[haohao@localhost test]$ stat file_timestamp
File: 'file_timestamp'
Size: 16 Blocks: 8 IO Block: 4096 regular file
Device: 100f5c8h/16840136d Inode: 97910802 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ haohao) Gid: ( 1000/ haohao)
Access: 2017-05-21 11:14:09.815598462 +0800
Modify: 2017-05-21 11:17:23.968598448 +0800
Change: 2017-05-21 11:17:23.968598448 +0800
Birth: -

可以看出文件内容更改后文件的mtime和ctime都更新了,atime保持不变。
更改文件的名称,大小,权限等只会更新文件的ctime,还是上面示例文件,更改下文件的文件名,然后stat查看:

1
2
3
4
5
6
7
8
9
10
[haohao@localhost test]$ mv file_timestamp file_timestamp.txt  
[haohao@localhost test]$ stat file_timestamp.txt
File: 'file_timestamp.txt'
Size: 16 Blocks: 8 IO Block: 4096 regular file
Device: 100f5c8h/16840136d Inode: 97910802 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ haohao) Gid: ( 1000/ haohao)
Access: 2017-05-21 11:14:09.815598462 +0800
Modify: 2017-05-21 11:17:23.968598448 +0800
Change: 2017-05-21 11:22:32.097598424 +0800
Birth: -

可以看出只有ctime发生了变化。

Nginx隐式页面跳转配置

发表于 2018-02-18 | 分类于 Nginx

Nginx实现将请求跳转到另一个网站的页面,在浏览器中URL保持不变。以下配置示例将请求路径https://abc.com/home/test 跳转到https://def.com/home/test/test.html 页面。

1
2
3
4
5
6
7
8
9
10
server {
listen 443;
server_name abc.com;
include server/ssl.conf;

location = /home/test {
rewrite /home/test /home/test/test.html break;
proxy_pass https://def.com;
}
}

从AWS S3下载指定日期范围的日志到本地

发表于 2018-02-18 | 分类于 Shell脚本

本脚本主要包括如下要点:

  • Shell脚本日期循环;
  • AWS S3命令行使用;
  • 通过正则进行日期合法性校验;
  • Shell命令执行无限重试,直到成功;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    # !/bin/bash
    # @Time : 2017/10/11 下午3:20
    # @Author : qianghaohao
    # @Mail : codenutter@foxmail.com
    # @File : s3log_downloader.sh

    #---------------- 脚本参数说明 --------------
    # $1: 业务类型
    # $2: 日志类型
    # $3: 开始时间: 年-月-日 ex:2017-10-10
    # $4: 结束时间: 年-月-日 ex:2017-10-10
    #--------------------------------------------
    PROFILE=s3_key_profile
    # 下载失败则无限重试
    function repeat()
    {
    while true
    do
    $@ && return
    sleep 5
    done
    }

    # -----------------------------------------------------
    # 合并一个目录下的文件到一个文件,
    # 函数参数说明:
    # $1:日志文件夹
    # $2:合并后文件名:%{business}_%{type}-%{date}.log
    # -----------------------------------------------------
    function merge_file()
    {
    cd $1 && ls -rt | xargs cat > $2 && rm -rf $1
    }

    datebeg="$3"
    dateend="$4"
    # 检查日期格式是否正确
    if [ -z "`echo "$datebeg" | grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"`" -o -z "`echo "$dateend" | grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"`" ]; then
    echo "Error: 日期格式不合法,请输入正确的日期格式[ex: 2017-09-09]..."
    exit -1
    fi

    beg_s=`date -d "$datebeg" +%s`
    end_s=`date -d "$dateend" +%s`

    while [ "$beg_s" -le "$end_s" ]
    do
    day=`date -d @$beg_s +"%Y-%m-%d"`
    s3_log_path="s3://s3-path/$1/$2/$day"
    local_log_path="/home/path/$1/$2/$day"
    local_log_file="/home/path/$1/$2/${1}-${2}-${day}.log"
    # 后台执行任务(非阻塞) 类似于多进程并发下载
    repeat aws s3 cp --recursive ${s3_log_path} ${local_log_path} --profile=$PROFILE && merge_file ${local_log_path} ${local_log_file} &
    beg_s=$((beg_s+86400))
    done
    wait
    echo "=============================> 下载完成 ============================"

常见软件版本及缩写

发表于 2018-02-18 | 分类于 软件开发基础知识
常见软件版本及缩写
  • Alpha: 内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。
  • Beta: 也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。
  • RC: (Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。
  • GA: General Availability,正式发布的版本,在国外都是用GA来说明release版本的。
  • RTM: (Release to Manufacture)是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM版也有出限制、评估版的。但是和正式版本的主要程序代码都是一样的。
  • OEM: 是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
  • RVL: 号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。
  • EVAL: 而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。
  • RTL: Retail(零售版)是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。α、β、λ常用来表示软件测试过程中的三个阶段,α是第一阶段,一般只供内部测试使用;β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。

原文链接:
http://www.blogjava.net/RomulusW/archive/2008/05/04/197985.html

1…101112…14

haohao

Talk is cheap. Show me the code.

134 日志
35 分类
43 标签
GitHub CSDN 开源中国 E-Mail
© 2017 — 2021 haohao
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.3
访问人数 总访问量 次