搭建自己的git服务器

自己搭建git服务器主要有两个目的:

  • 可用来做一个团队的私有仓库,自己的服务器安全可控
  • 让代码自动同步到服务器,而不是每次用ftp,比较方便

系统 centos6 国外vps

步骤:

1. 安装git

一般服务器都自带git。如果嫌版本低,可以选择卸载重装。

2. 创建用户

groupadd git
adduser git -g git

3.创建authorized_keys文件

cd /home/git
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
cd /home
chown -R git:git git

4. 客户端创建密钥并上传

ssh-keygen -t rsa -C "your_email"

该命令会产生两个文件: id_rsa对应私钥,id_rsa.pub对应公钥。

将id_rsa.pub中的内容写到服务器的authorized_keys文件中。

如果有多个客户端,那么在authorized_keys文件中,一行保存一个客户端的公钥。

5. 创建git仓库

为了方便管理,所有的git仓库都置于同一目录下,假设为/data/gitrepo ,

cd /data
mkdir gitrepo
chown git:git gitrepo

接下来,创建我们的第一个git仓库:sample.git ,
服务器上的Git仓库通常都以.git结尾

cd gitrepo
git init --bare sample.git
// 修改所属用户
chown -R git:git sample.git

6. 克隆仓库到本地

$ git clone git@your-ip:/data/gitrepo/sample.git

7.禁用shell登录

安全性考虑git用户只提供git服务,不让登录到系统。

编辑/etc/passwd文件 找到类似下面的一行:

git:x:503:503::/home/git:/bin/bash

改为

git:x:503:503::/home/git:/sbin/nologin

8. 设置自动更新钩子

设置当有客户端push过来自动更新到指定目录(站点目录)

cd /data/girepo/sample.git/hooks
cp post-receive.sample post-receive
vi post-receive
//添加以下这句到文件
git --work-tree=/data/wwwroot/your-site-dir checkout -f
//保存
:wq

(完)

将代码从Git自动部署到容器

【编者的话】将您的代码从您的Git仓库转移到您的容器可能是一件痛苦的工作。本文介绍了如何实现自动化部署。

有许多方法可以将您的源代码从Git 仓库部署到容器中,包括整个容器的重新部署、通过卷的即时重新部署或“git clone”方法。然而,当涉及到这一过程的自动化和持续部署时,许多开发人员可能会面临其中的复杂性,因为他们需要知道如何正确地将所有应用程序组件与所需的互连点结合起来。

尤其是在容器里,必须管理所构建的堆栈映像来处理CI/CD管道引起的额外复杂性。如果在操作系统、应用服务器堆栈或其依赖项中进行频繁的提交,那么整个容器重新部署可能不是最好的方法。

未分类

为了简化部署自动化,Jelastic准备了一种特殊专用的Git-Push-Deploy包,用于将代码交付到初步构建的容器映像中。这个包实现了许多配置,以便在您的Git应用程序源存储库中自动部署提交的更改,使其能够在最小延迟的情况下进行进一步的测试。

Git-Push-Deploy 细节

Git-Push-Deploy包可以与GitHub和GitLab存储库集成。它是为在Java、PHP、Ruby和Node.js和Python应用源代码中自动提供更新而开发的。可以应用于以下认证的模板:

  • Java – Tomcat 6/7/8/9, TomEE, GlassFish 3/4, Jetty 6/8/9, WildFly 8/9/10, JBoss AS 7, Spring Boot 1.x
  • PHP – Apache 2.4, NGINX 1.10
  • Ruby – Apache 2.4, NGINX 1.10
  • Node.js – Node.js 0.x-6.x
  • Python – Apache 2.4

工作流依赖于项目中使用的编程语言:

  • 对于基于Java的项目,该包将创建一个单独的环境,其中包含Maven构建节点,它将负责与远程Git存储库的交互,从而触发您的应用程序构建及其部署到应用程序服务器。
  • 对于PHP / Ruby /Node.js/python应用中,该包为项目的部署直接在Web服务器的ROOT context上设置了一个管道(这里,认为 Ruby应用程序服务器提供的是一种部署模式,而不是dashboard的context,尽管实际项目位置是相同的)。

这个部署自动化包与4.9.5版本的Jelastic PaaS以及更高版本兼容。要查看和比较可用的管理平台和特定的Jelastic版本,请参考Jelastic Cloud Union目录。

库预配置

对于特定的附加安装,您需要为您的Git帐户提供一个个人的API Token。这可以使包为对应的存储源设置一个webhook,在每次更改代码并使其生效时,来初始化重新部署应用。

我们来生成一个。根据你所使用的Git VCS,GitHub或者GitLab对应以下指示进行操作。

在GitHub上生成Access Token

要为您的GitHub帐户获取您的personal access token,请访问Settings > Personal access tokens然后点 Generate new token按钮。

未分类

在打开的页面中,选定Token description,并选择repo和admin:repohook,在页面底部单击Generate token。

未分类

将生成的access token复制保存起来(因为离开这个页面之后,就不能再被查看)。

未分类

完成这一步之后,开始继续安装Git-Push-Deploy包。

在GitLab上生成Access Token

要在GitLab生成一个personal access token,进入您的帐户settings并切换到Access Tokens。

在这里,指定可选的token名称,它的到期日期(可以留空),并勾选api权限范围。

未分类

点击 Create Personal Access Token按钮。

在打开的页面中,复制并临时将您的访问令牌值存储在其他地方(因为离开本页后您将无法再次看到它)。

未分类

现在,您已经准备好继续安装Git-Push-Deploy包了。

Java项目的额外预配置

如果运行一个基于Java的项目,您需要通过在其结构中添加一个特殊的项目对象模型(POM)文件来开始与Maven构建节点进行适当的交互。
所以,创建一个pom.xml文件在项目源的根目录中,然后必须添加下面的内容:

<project>    
<modelVersion>4.0.0</modelVersion>    
<groupId>com.mycompany.app</groupId>    
<artifactId>my-app</artifactId>    
<version>1.0</version>    
<packaging>war</packaging>    
<build>        
<finalName>${project.artifactId}</finalName>   
</build> 
</project>

可选值:

  • groupId -项目组(例如公司名称)。
  • artifactId-项目的名称。
  • version -应用版本。

其余的参数都应该保持不变。您可以在我们的示例中查看如何配置。

安装Git-Push-Deploy包

Git-Push-Deploy包是一个附加组件,因此它只能安装在一个环境的顶部。我们已经准备了两个独立的环境,分别使用Tomcat和apache-php应用程序服务器来展示不同编程语言的工作流。

如果你打算使用以前创建的环境,请注意这个包将覆盖部署到根目录的应用程序。因此,为了保持已经部署的应用程序,将其移动到用户目录。我们建议创建一个新的环境,然后进行接下来的安装:

1、单击dashboard顶部窗格中的Import按钮,在打开的URL选项卡中插入一个manifest.jps链接:

https://github.com/jelastic-jps/git-push-deploy/blob/master/manifest.jps

未分类

单击Import 继续。

2、在打开的框架中,指定关于源和目标环境的详细信息:

  • Git Repo URL – HTTPS连接到你的应用程序的“repo“(或者 .git或普通视图)。您可以fork我们的示例Hello World应用程序来测试流。
  • Branch – 项目分支。
  • User – 输入您的Git登录帐户。
  • Token –指定您之前为webhook生成创建的 access token。
  • Environment name – 选择要部署应用程序的环境。
  • Nodes – 应用程序服务器名(在选择环境时自动获取)。

未分类

单击“Install ”继续。

3、等一分钟让Jelastic从GitHub获取应用程序资源,配置webhook以进行接下来的部署。

未分类

安装完成后点击“Close“关闭通知框。

4、根据项目类型的不同,会有如下结果:

  • 对于基于Java的基础设施,您将在dashboard中看到一个新的环境,其中包含Maven构建节点;它将在每次更新源代码时,在Web服务器上构建和部署应用程序到Root context下。

未分类

请注意,Maven可能需要花费一些时间来编译一个项目(尽管包安装本身已经完成了),因此您需要等待几分钟才能启动它。这个操作的当前进展可以通过Maven的vcs_update 日志文件实时跟踪。

未分类

  • 对于基于PHP的基础设施(以及其他受支持的语言),您的应用程序将直接部署到所选的服务器Root context上。

请注意,Ruby应用程序服务器的类似项目部分提供了关于使用的部署模式(默认情况下开发)的信息,而不是context,同时实际的应用程序位置也引用了服务器root。

要启动应用程序,请单击web服务器旁边的Open in browser。

未分类

就是这样!现在,您的应用程序的新版本在每次提交到源端时都会自动地发送到应用程序服务器。

不同服务栈的重新部署策略

下面的表列出了在接收到更新后的代码后不同应用服务器的反应。

未分类

为了消除可能的应用程序停机时间,可以使用重新启动更新策略,将其扩展到多个容器中。在这种情况下,所需的更新将按顺序应用到实例中,默认情况下延迟30秒。

通过Git上来测试自动部署

现在让我们来看看这个过程是如何工作的。对源端的代码做一些细微的调整,确保一切都是自动化的:

1、单击您的项目源中的某个项目的Edit this file,并Commit changes——例如,我们将修改HelloWorld启动页面上的文本。

未分类

2、因此,将触发适当的webhook来将所做的更改部署到您的主机环境中——请参考存储库Settings > Webhooks部分以了解详细信息。

未分类

单击此字符串后,您将看到由webhook发起的最近交付的列表,以及它们执行的结果。

3、最后一个检查,返回到您的应用程序页面并刷新(同时记住,Maven可能需要额外的一分钟来构建和部署您的基于Java的项目)。

未分类

就是这样!正如您所看到的,这些修改成功地应用了,因此这个方案按照我们预期的方式工作。

只需更新代码,按照通常的方法进行提交,所有的更改都会自动地推送到您的Jelastic环境中。不需要在进程之间切换,也不需要手动更新,从而消除人为错误,并加速应用程序的上线时间。

原文链接: https://dzone.com/articles/deploy-code-to-containers-from-git-automatically-1 (翻译:edge_dawn)

Jenkins之权限分配

一、操作环境

1、Jenkins

  • Jenkins 2.75

二、权限配置地点

在Jenkins的主界面中,点击【系统管理】

未分类

在【系统管理】中点击【Configure Global Security】

未分类

在【Configure Global Security】页面中,在“授权策略”中将“项目矩阵授权策略”选中

未分类

三、配置权限

在配置权限前,首先得将自己的系统用户创建好,一个是拥有所有权限的系统管理员admin,另一个是专供开发人员所使用的dev,创建好之后如下:

未分类

在刚才的“授权策略”中,在“添加用户/组”中,添加“admin”点击【添加】按钮,之后重复刚才的操作,添加“dev”

未分类

由于“admin”是系统管理员,所以说拥有全部的权限,所以说将全部的权限复选框全部选中,而dev是属于开发人员,因而我们只希望其具有项目构建的权限,所以说我们会只给其分配“Read”和“Build”权限,而匿名用户,我们往往只希望其能够查看项目,不允许其进行任何的操作,因而只分配“Read”权限,分配完之后的结果如下所示:

未分类

Centos7下Etcd集群搭建

一、简介

“A highly-available key value store for shared configuration and service discovery.”

Etcd是coreos开发的分布式服务系统,内部采用raft协议作为一致性算法。作为一个高可用的配置共享、服务发现的键值存储系统,Etcd有以下的特点:

  • 简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单
  • 安全:支持 SSL 证书验证
  • 快速:根据官方提供的数据,单实例支持每秒2k+读操作、1k写操作
  • 可靠:采用raft算法,实现分布式系统数据的可用性和一致性

Etcd构建自身高可用集群主要有三种形式:

  • 静态发现: 预先已知 Etcd 集群中有哪些节点,在启动时直接指定好Etcd的各个node节点地址
  • Etcd动态发现: 通过已有的Etcd集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
  • DNS动态发现: 通过DNS查询方式获取其他节点地址信息

本文主要介绍第一种方式,后续会陆续介绍剩下的两种方式。(直接docker安装请移步:quay.io/coreos/etcd 基于Docker镜像的集群搭建)

二、环境介绍

三台虚拟机,系统环境均为Centos7,对应节点名称及IP地址如下:

  • node1:192.168.7.163
  • node2:192.168.7.57
  • etcd2:192.168.7.58

首先将这个信息添加到三台主机的hosts文件中,编辑/etc/hosts,填入以下信息:

  • 192.168.7.163 node1
  • 192.168.7.57 node2
  • 192.168.7.58 etcd2

三、安装、配置Etcd

# yum install etcd -y

yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,以下将三个节点上的配置贴出来,请注意不同点(未贴出的,则表明不需要更改)

node1

# [member]
# 节点名称
ETCD_NAME=node1
# 数据存放位置
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
# 监听其他 Etcd 实例的地址
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
# 监听客户端地址
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
# 通知其他 Etcd 实例地址
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://node1:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
# 初始化集群内节点地址
ETCD_INITIAL_CLUSTER="node1=http://node1:2380,node2=http://node2:2380,etcd2=http://etcd2:2380"
# 初始化集群状态,new 表示新建
ETCD_INITIAL_CLUSTER_STATE="new"
# 初始化集群 token
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
# 通知 客户端地址
ETCD_ADVERTISE_CLIENT_URLS="http://node1:2379,http://node1:4001"

node2

# [member]
ETCD_NAME=node2
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://node2:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="node1=http://node1:2380,node2=http://node2:2380,etcd2=http://etcd2:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://node2:2379,http://node2:4001"

etcd2

# [member]
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd2:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="node1=http://node1:2380,node2=http://node2:2380,etcd2=http://etcd2:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://etcd2:2379,http://etcd2:4001"

改好配置之后,在各个节点上开启etcd服务:

# systemctl restart etcd

四、测试验证

[root@localhost ~]# etcdctl set testdir/testkey0 0
0
[root@localhost ~]# etcdctl set testdir/testkey1 1
1
[root@localhost ~]# etcdctl set testdir/testkey2 2
2
[root@localhost ~]# etcdctl ls
/test
/testdir
[root@localhost ~]# etcdctl ls testdir
/testdir/testkey0
/testdir/testkey1
/testdir/testkey2
[root@localhost ~]# etcdctl get testdir/testkey2
2
[root@localhost ~]# etcdctl member list
377aa10974e8238d: name=node1 peerURLs=http://node1:2380 clientURLs=http://node1:2379,http://node1:4001 isLeader=true
9de2d4fdbbd835b6: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379,http://etcd2:4001 isLeader=false
f75ed833c7cbbe65: name=node2 peerURLs=http://node2:2380 clientURLs=http://node2:2379,http://node2:4001 isLeader=false

linux下精确指定账号和密码过期时间

以前的一篇文章”linux下忘记用户密码并已过期,且又不能改变密码该怎么办?”(https://shengbao.org/203.html) 中最后,留下过一个彩蛋。如何精确简单的指定账号密码的过期时间?这里其实本意是指定密码过期时间。自己当时问的都不严谨。

未分类

分析问题

我们开始分析chage命令,是否存在指定过期时间的命令。

chage参数意思:

  • -m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。
  • -M 密码保持有效的最大天数。
  • -W 用户密码到期前,提前收到警告信息的天数。
  • -E 帐号到期的日期。过了这天,此帐号将不可用。
  • -d 上一次更改的日期
  • -i 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
  • -l 例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。

首先,我们来看账号信息

未分类

该yunwei账号有效期为永久。我们来使用-E参数指定过期时间。

Chage -E 2017-08-28 yunwei

未分类

从上图 可以看到生效的选项为:accunt expires(账号过期日)。不是我们需要的准确的密码过期选项。

那如何精确的控制密码过期时间呢?

未分类

如上图,我们首先使用chage -M 1 yunwei,密码有效期延后1天。如何精确的控制密码过期时间,只有这个笨办法。

接着我们再来仔细的思考下,如果你有效期设置的时间比较久,是不是要算很大的数字来得出准确的时间呢?

突发奇想,将最后密码修改时间改为今天,是不是更方便呢?

chage -d 2017-08-27 yunwei

然后,想让他月底过期就很方便了

chage -M 4 yunwei

补充

回想了下,chage -d 指定最后密码修改时间。如果将有效期设定为今天,密码有效期会不会自动改变呢?经过测试,密码有效期如果指定为180天的话。如果,chage -d 设置为今天后,密码有效期自动从当前日期开始计算180天。

结论分析

很多知识在学习的时候不仔细,以前一直觉得-M 选项的计数是1970-01-01开始的,后来查看了-E参数,才恍然大悟,这是账号过期时间。不是密码过期时间。密码过期时间=最后修改时间+天数

解决Linux中crontab不执行ntpdate问题

解决Linux中crontab尚未执行ntpdate问题

未分类

[root@localhost ~]# crontab -l
*/1 * * * * ntpdate time.nist.gov

我是每分钟同步时间,上面看上去是没什么问题,但是你能很容易的发现命令行经常弹出You have new mail in /var/spool/mail/root 类似于这种提示。

当你打开这个文件会有如下提示:/bin/sh: ntpdate: command not found

上面的意思是:在/bin/sh 下找不到ntpdate命令

解决办法:

使用whereis命令查找ntpdate命令

[root@localhost ~]# whereis ntpdate
ntpdate: /usr/sbin/ntpdate /usr/share/man/man8/ntpdate.8.gz

然后重新更改crontab定时任务

[root@localhost ~]# crontab -l
*/1 * * * * /usr/sbin/ntpdate time.nist.gov

保存后即可解决。

crontab定时监控tomcat进程 停止时自动启动

一、创建monitor.sh文件

[root@izjjh7u0ge4d6yz tomcat]# vi monitor.sh

编辑内容为:

#!/bin/sh  
#获取tomcat进程ID  
TomcatID=$(ps -ef | grep tomcat | grep -w 'tomcat'|grep -v 'grep'|awk '{print $2}')  
#Tomcat启动程序(根据自己路径编写)  
StartTomcat=/usr/local/tomcat/bin/startup.sh  
TomcatCache=/usr/local/tomcat/work  
#定义要监控的页面地址(写比较简单页面即可)  
WebUrl=https://hao.360.cn/?wd_xp1  
#日志输出  
TomcatMonitorLog=/tmp/TomcatMonitor.log  
Monitor(){  
   echo "[info]开始监控tomcat...[$(date +'%F %H:%M:%S')]"  
   #判断Tomcat进程是否存在  
   if [[ $TomcatID ]];then  
   echo "[info]当前tomcat进程ID为:$TomcatID,继续检测......"  
   #检测是否启动成功(成功的话页面会返回状态"200")  
   TomcatServiceCode=$(curl -I -m 10 -o /dev/null -s -w %{http_code} $WebUrl)  
   if [ $TomcatServiceCode -eq 200 ];then  
     echo "[info]返回码为$TomcatServiceCode,tomcat启动成功,测试正常......"  
  else  
     echo "[error]tomcat出错,请注意......状态码为$TomcatServiceCode,错误日志已输出到$TomcatMonitorLog[error],开始重启tomcat"  
   #杀掉原tomcat进程  
   kill -9 $TomcatID    
  sleep 3  
   #清理tomcat缓存  
  rm -rf $TomcatCache    
  $StartTomcat  
  fi  
 else  
   echo "[error]tomcat进程不存在!tomcat开始自动重启......[info]$StartTomcat,请稍候......"  
  rm -rf $TomcatCache  
  $StartTomcat  
  fi  
 echo "编写完成"  
 }  
 Monitor>>$TomcatMonitorLog  

二、保存退出后,给脚本执行权限

指令:chmod a+xmonitor.sh

三、启动脚本,使用crontab执行定时任务

[root@izjjh7u0ge4d6yztomcat]# ./monitor.sh

看monitor.sh文件是否已经监控,如下图所示:

未分类

使用crontab需要先启动crontab,然后使用vi添加定时执行任务。

[root@izjjh7u0ge4d6yz tomcat]# /sbin/service crond start
[root@izjjh7u0ge4d6yztomcat]# vi /etc/crontab

添加内容为:

*/1 * * * * /usr/local/tomcat/monitor.sh

保存并退出,可以用crontab -l指令来查看当前的定时任务。

定时执行任务Crontab的20个例子

简介

Linux crontab和Windows task schedules非常的相似。Crontab可以用来在系统中定期的执行任务。比如:写了一个爬虫需要每天早上八点执行,就可以用到Crontab;安装的Tomcat服务器需要每天凌晨重启一次,也可以使用到Crontab。总之,几乎所有的定时任务,我们都可以通过Crontab这个工具来完成。

Crontab在Linux上的结构

未分类

从左到右依次为:

[分钟] [小时] [每月的某一天] [每年的某一月] [每周的某一天] [执行的命令]

注意:请留意每个选项的取值范围。

如何 添加/编辑 Crontab

  • 添加或更新crontab中的命令
crontab -e

默认情况下,系统会编辑当前登录用户的crontab命令集合。需要编辑其他用户的命令集合,需要使用到如下的命令

crontab -u username -e

查看Crontab命令集合

  • 查看当前系统登录用户的Crontab命令集合
crontab -l
  • 查看其他用户的Crontab命令集合
crontab -u username -l

20个超实用的Crontab使用实例

  • 每天 02:00 执行任务
0 2 * * * /bin/sh backup.sh
  • 每天 5:00和17:00执行任务
0 5,17 * * * /scripts/script.sh
  • 每分钟执行一次任务

通常情况下,我们并没有每分钟都需要执行的脚本(默默的想到了12306–)

* * * * *  /scripts/script.sh
  • 每周日 17:00 执行任务
0 17 * * sun  /scripts/script.sh
  • 每 10min 执行一次任务
*/10 * * * * /scripts/monitor.sh
  • 在特定的某几个月执行任务
* * * jan,may,aug * /script/script.sh
  • 在特定的某几天执行任务
0 17 * * sun,fri /script/scripy.sh

在每周五、周日的17点执行任务

  • 在某个月的第一个周日执行任务
0 2 * * sun  [ $(date +%d) -le 07 ] && /script/script.sh
  • 每四个小时执行一个任务
0 */4 * * * /scripts/script.sh
  • 每周一、周日执行任务
0 4,17 * * sun,mon /scripts/script.sh
  • 每个30秒执行一次任务

我们没有办法直接通过上诉类似的例子去执行,因为最小的是1min。但是我们可以通过如下的方法。

* * * * * /scripts/script.sh
* * * * *  sleep 30; /scripts/script.sh
  • 多个任务在一条命令中配置
* * * * * /scripts/script.sh; /scripts/scrit2.sh
  • 每年执行一次任务
@yearly /scripts/script.sh

@yearly 类似于“0 0 1 1 *”。它会在每年的第一分钟内执行,通常我们可以用这个发送新年的问候。

  • 每月执行一次任务
@yearly /scripts/script.sh
  • 每周执行一次任务
@yearly /scripts/script.sh
  • 每天执行一次任务
@yearly /scripts/script.sh
  • 每分钟执行一次任务
@yearly /scripts/script.sh
  • 系统重启时执行
@reboot /scripts/script.sh
  • 将 Cron 结果重定向的特定的账户

默认情况下,cron 只会将结果详情发送给 cron 被制定的用户。如果需要发送给其他用户,可以通过如下的方式:

# crontab -l
MAIL=bob
0 2 * * * /script/backup.sh
  • 将所有的 cron 命令备份到文本文件当中

这是一个当我们丢失了cron命令后方便快速的一个恢复方式。
下面是利用这个方式恢复cron的一个小例子。(看看就行~)
首先:检查当前的cron

# crontab -l
MAIL=rahul
0 2 * * * /script/backup.sh

然后:备份cron到文件中

# crontab -l > cron-backup.txt
# cat cron-backup.txt
MAIL=rahul
0 2 * * * /script/backup.sh

接着:移除当前的cron

# crontab -r
# crontab -l
no crontab for root

恢复:从text file中恢复

# crontab cron-backup.txt
# crontab -l
MAIL=rahul
0 2 * * * /script/backup.sh

crontab mysql定时备份

本人环境配置

  • ubuntu: 17.04
  • mysql: 5.7.18-15

编写 备份脚本

$ cat bkDbname.sh
#!/bin/bash
BKPATH="/path/to/shell-path/"
BKDBNAME="dbname"
BKDATE=$(date +%Y%m%d_%H%m%s)
BKFILE=${BKPATH}${BKDBNAME}_${BKDATE}.sql.gz
/usr/bin/mysqldump -uroot -p"password" ${BKDBNAME} | gzip>${BKFILE}

添加定时任务

打开编辑 /etc/crontab, 在末尾添加 定时任务.

 # back database 每天17点备份
 0 17   * * *   willike sh /path/to/shell-path/bkDbname.sh

crontab定时任务 格式
minute hour day month week command
分 时 日 月 周 命令

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

python virtualenv 虚拟环境的使用

虚拟环境是一个将不同项目所需求的依赖分别放在独立的地方的一个工具,它给这些工程创建虚拟的 Python环境。它解决了“项目X依赖于版本1.x,而项目Y需要项目4.x”的两难问题,而且使你的全局 site-packages 目录保持干净和可管理。软件工程师全都是有洁癖的,这就出现下面的神器 virtualenv。

安装 virtualenv

首先,我们用 pip 安装 virtualenv:

$ pip install virtualenv

测试你的安装

$ virtualenv --version

进入我们的项目目录,创建一个独立的 Python 运行环境,命名为 venv。virtualenv venv 将会在当前的目录中创建一个文件夹包含了 Python 可执行文件, 以及 pip 库的一份拷贝,这样就能安装其他包了。虚拟环境的名字(此例中是 venv ) 可以是任意的;若省略名字将会把文件均放在当前目录。

$ cd /data/myproject
$ virtualenv --no-site-packages venv
Using base prefix '/usr/local/.../Python.framework/Versions/3.4'
New python executable in venv/bin/python3.4
Also creating executable in venv/bin/python
Installing setuptools, pip, wheel...done.

你可以选择使用一个Python解释器(比如python2.7):

$ virtualenv -p /usr/bin/python2.7 venv

命令 virtualenv 就可以创建一个独立的 Python 运行环境,我们还加上了参数 –no-site-packages,这样,已经安装到系统 Python 环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的 Python 运行环境。

进入独立环境

新建的 Python 环境被放到当前目录下的 venv 目录。有了 venv 这个 Python 环境,可以用 source 进入该环境:

$ source venv/bin/activate
(venv) $

以下命令会有相同效果:

$ . ./venv/bin/activate
(venv) $

注意到命令提示符变了,有个 (venv) 前缀,表示当前环境是一个名为 venv 的 Python 环境。

下面就可以正常安装各种第三方扩展包,并运行 python 命令:

(venv) $ pip3 install flask

在 venv 环境下,用 pip 安装的包都被安装到 venv 这个环境下,系统 Python 环境不受任何影响。也就是说,venv 环境是专门针对 myproject 这个应用创建的。

退出独立环境

退出当前的 venv 环境,使用 deactivate 命令:

(venv) $ deactivate
$

此时就回到了正常的环境,现在 pip 或 python 均是在系统 Python 环境下执行。

完全可以针对每个应用创建独立的 Python 运行环境,这样就可以对每个应用的 Python 环境进行隔离。

virtualenv 是如何创建“独立”的 Python 运行环境的呢?原理很简单,就是把系统 Python 复制一份到 virtualenv 的环境,用命令 source venv/bin/activate 进入一个 virtualenv 环境时,virtualenv 会修改相关环境变量,让命令 python 和 pip 均指向当前的 virtualenv 环境。

自动激活环境工具 autoenv

当你 cd 进入一个包含 .env 的目录中,就会 autoenv 自动激活那个环境。

使用 brew 在 Mac OS X上安装它:

$ brew install autoenv

在 Linux 上:

$ git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv
$ echo 'source ~/.autoenv/activate.sh' >> ~/.bashrc

项目地址:https://github.com/kennethreitz/autoenv/

其它注意

运行带 –no-site-packages 选项的 virtualenv 将不会包括全局安装的包。 这可用于保持包列表干净,以防以后需要访问它。(这在 virtualenv 1.7及之后是默认行为)