Linux中crontab任务计划不执行的问题分析

在使用配置crontab过程中一直不能执行配置的任务,折腾了半夜没有解决,随找到如下文章,查问题的思路很清晰,帮我找到了问题,直接转:

crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

使用权限:
root用户和crontab文件的所有者
语法:
crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
说明:
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
参数:
-e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r [UserName]: 删除目前的时程表
-l [UserName]: 列出目前的时程表
-v [UserName]:列出用户cron作业的状态
自拉起脚本很简单,随便写几行就搞定了:
Shell
#!/bin/bash
processcount=$(pgrep my_app|wc -l)
cd $(cd $(dirname $0) && pwd)
if [[ 0 -eq $processcount ]]
then
echo “[ $(date) ] : my_app is down, start it!” | tee -ai ./checkprocess.log
bash ./start.sh #这里是项目的重启脚本
else
echo my_app is OK!
fi
然后丢到 crontab,1分钟执行一次:
Shell

* * * * * bash /data/app_server/checkprocess.sh >/dev/null 2>&1
本以为万事大吉了,结果还是坑了,进程再一次挂了,尼玛什么鬼?
一、检查日志
根据经验,先看一下crontab的日志:
tail /var/log/messages
没发现相关日志,看来不是打印到了这,于是查看了下crontab的默认日志位置:
tail /var/log/cron

Mar 25 21:40:01 li733-135 CROND[1959]: (root) CMD (sh /data/app_server/checkprocess.sh >/dev/null 2>&1)
Mar 25 21:40:01 li733-135 CROND[1960]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Mar 25 21:40:01 li733-135 CROND[1961]: (root) CMD (/usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1)
Mar 25 21:41:01 li733-135 CROND[2066]: (root) CMD (sh /data/app_server/checkprocess.sh >/dev/null 2>&1)
很明显,任务计划确实在正常执行着,看来问题在脚本上了。
二、检查脚本

①、直接执行
检查脚本第一步,直接按照crontab里面的命令行,执行脚本:
sh /data/app_server/checkprocess.sh
[ Fri Mar 25 21:25:01 CST 2016 ] : my_app is down, start it!

sh /data/app_server/checkprocess.sh
my_app is OK!
结果进程正常拉起了!
直接执行成功,而放到crontab就失败,经验告诉我肯定的脚本环境变量有问题了!
②、环境变量
于是在脚本里面载入环境变量:
#!/bin/bash
#先载入环境变量
source /etc/profile
#其他代码不变
然后手工把进程杀死,等待自拉起,结果… 还是不行!
③、系统邮件
经验告诉我,crontab执行失败,如果没有屏蔽错误的话,会产生一个系统邮件,
位置在 /var/spool/mail/root
所以,我把crontab里面的 2>&1 这个屏蔽错误先取消掉,等待几分钟查看邮件。
cat /var/spool/mail/root 发现有如下报错:

From root@free-node-us.localdomain Fri Mar 25 21:30:02 2016
Return-Path: <root@app_server.localdomain>
X-Original-To: root
Delivered-To: root@app_server.localdomain
Received: by app_server.localdomain (Postfix, from userid 0)
id 78DB5403E2; Fri, 25 Mar 2016 21:19:02 +0800 (CST)
From: root@app_server.localdomain (Cron Daemon)
To: root@app_server.localdomain
Subject: Cron <root@app_server> bash /data/app_server/checkprocess.sh >/dev/null
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20160325131902.78DB5403E2@app_server.localdomain>
Date: Fri, 25 Mar 2016 21:19:02 +0800 (CST)

start.sh: line 4: /sbin/sudo: No such file or directory #sudo命令找不到!我次奥·~
居然是脚本里面的sudo执行失败了,找不到这个文件。看来单纯的载入 profile 不一定靠谱啊!
③、修复脚本
知道问题所在,解决就简单了,粗暴点,直接写入sudo的绝对路径 /usr/bin/sudo
继续测试自拉起,结果… 还是不行!R了G了!!
三、最终解决
继续查看了下系统邮件,发现如下信息:
Subject: Cron <root@free-node-us> source /etc/profile;bash /data/app_server/checkprocess.sh >/dev/null
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20160325132403.0E8E1403E2@app_server.localdomain>
Date: Fri, 25 Mar 2016 21:24:03 +0800 (CST)

sudo: sorry, you must have a tty to run sudo #原来是这个问题!
很明显,提示了sudo必须需要tty才能执行,解决很简单,取消这个限制即可!
编辑 /etc/sudoers ,找到 Defaults requiretty, 然后注释掉这行:

vim /etc/sudoers

#Defaults requiretty
最后使用 :x! 或 :wq! 强制保存即可。
结果观察还是报了相同的错误!原来改完这个sudo并不会影响已经运行的crontab,所以需要重启crontab服务刷新下设置:

service crond restart
这下终于可以了!

四、分析总结
Linux系统里面计划任务,crontab 没有如期执行这是运维工作中比较常见的一种故障了,根据经验,大家可以从如下角度分析解决:

①、检查crontab服务是否正常
这个一般通过查看日志来检查,也就是前文提到的 /var/log/cron 或 /var/log/messages,如果里面没有发现执行记录,那么可以重启下这个服务:service crond restart
②、检查脚本的执行权限
一般来说,在crontab中建议使用 sh 或 bash 来执行shell脚本,避免因脚本文件的执行权限丢失导致任务失败。当然,最直接检查就是人工直接复制crontab -l 里面的命令行测试结果。
③、检查脚本需要用到的变量
和上文一样,通常来说从crontab里面执行的脚本和人工执行的环境变量是不一样的,所以对于一些系统变量,建议写绝对路径,或使用witch动态获取,比如 sudo_bin=$(which sudo) 就能拿到 sudo在当前系统的绝对路径了。
④、放大招:查看日志
其实,最直接最有效的就是查看执行日志了,结合crontab执行记录,以及crontab执行出错后的系统邮件,一般都能彻底找到失败的原因了!当然,要记住在crontab中如果屏蔽了错误信息,就不会发邮件了。
这又让我想起了如果crontab未屏蔽日志,可能会导致硬盘 inode 爆满

Zookeeper安装使用(centos7.2)

Zookeeper 安装

安装java:yum install java

 

Zookeeper下载目录(选择稳定版本):http://apache.org/dist/zookeeper/

例如:http://apache.org/dist/zookeeper/stable/zookeeper-3.4.9.tar.gz

 

解压:

tar -zxvf zookeeper-3.4.9.tar.gz -C /opt/libs

 

“bin目录”中存放有运行脚本;“conf目录”中存放有配置文件;“lib目录”中存放有运行所需要第三方库

 

Zookeeper 配置

一、机模式

1.1编辑配置文件:

> cp /opt/libs/zookeeper-3.4.9/conf/zoo_sample.cfg /opt/libs/zookeeper-3.4.9/conf/zoo.cfg> vi /opt/zookeeper/conf/zoo.cfg 编辑修改下面信息: dataDir=/opt/data/zookeeper/         //数据目录. 可以是任意目录.dataLogDir=/opt/data/zookeeper/logs  //log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和#dataDir相同的设置.clientPort=2181                  //监听client连接的端口号tickTime=2000                        //zookeeper中使用的基本时间单位, 毫秒值.

 

启动与停止:

方式1:

启动zookeeper服务:

/opt/libs/zookeeper-3.4.9/bin/zkServer.sh start

停止zookeeper服务:

/opt/libs/zookeeper-3.4.9/bin/zkServer.sh stop

方式2:

/opt/libs/zookeeper-3.4.9/bin/zkServer.sh start-foreground (非后台运行ZooKeeper Server进程)

验证是否成功:telnet 127.0.0.1 2181

 

二、集群模式

Zookeeper的分布式部署安装详细文档(集群模式)

集群模式有两种形式:
1)使用多台机器,在每台机器上运行一个ZooKeeper Server进程;
2)使用一台机器,在该台机器上运行多个ZooKeeper Server进程。
在生产环境中,一般使用第一种形式,在练习环境中,一般使用第二种形式。

 

配置

  1. data目录
    用于存放进程运行数据。
  2. data目录下的myid文件
    用于存储一个数值,用来作为该ZooKeeper Server进程的标识。
  3. 监听Client端请求的端口号
  4. 监听同ZooKeeper集群内其他Server进程通信请求的端口号
  5. 监听ZooKeeper集群内“leader”选举请求的端口号
    该端口号用来监听ZooKeeper集群内“leader”选举的请求。注意这个是ZooKeeper集群内“leader”的选举,跟分布式应用程序无关。

参数配置注意事
1)同一个ZooKeeper集群内,不同ZooKeeper Server进程的标识需要不一样,即myid文件内的值需要不一样
2)采用上述第2种形式构建ZooKeeper集群,需要注意“目录,端口号”等资源的不可共享性,如果共享会导致ZooKeeper Server进程不能正常运行,比如“data目录,几个监听端口号”都不能被共享

myid Data Client Server Leader 配置文件
1 /opt/data/zookeeper/z1 2181 2222 2225 z1.cfg
2 /opt/data/zookeeper/z2 2182 3333 3335 z2.cfg
3 /opt/data/zookeeper/z3s 2183 4444 4445 z3.cfg

配置如下:

# zx.cfg

tickTime=2000

initLimit=10

syncLimit=2

dataDir=/opt/data/zookeeper/zx

clientPort=218x

# server.x中的“x”表示ZooKeeper Server进程的标识

server.1=127.0.0.1:2222:2225

server.2=127.0.0.1:3333:3335

server.3=127.0.0.1:4444:4445

注:

  • initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为 initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.
  • syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即

 

设置myid

>echo “1” > /opt/data/zookeeper/z1/myid

>echo “2” > /opt/data/zookeeper/z2/myid

>echo “3” > /opt/data/zookeeper/z3/myid

 

启动ZooKeeper集群

分别执行

bin/zkServer.sh start conf/z1.cfg,

bin/zkServer.sh start conf/z2.cfg

bin/zkServer.sh start conf/z3.cfg

安装验证

执行命令(建立ZooKeeper Client端到ZooKeeper集群的连接会话)

bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

 

 管理界面:zkdash: 

安装与运行:

  • 安装并运行mysql
  • 下载zkdash

·        git clone https://github.com/ireaderlab/zkdash.git   (Python2.7)

git clone  https://github.com/wolfelee/zkdash.git  (Python3.5.2,对原版进行了python3的兼容性修改)

  • 安装依赖项

·       cd zkdash·       pip install -r requirements.txt·       (如果报错,直接一项一项安装)

  • pip install peewee

·        

  • 设置配置文件

根据需要修改当前目录下./conf/conf.yml中相关配置信息,配置文件详细说明见后面

  • 同步数据库表结构 首先创建数据库zkdash,并设置数据库的用户名和密码 将配置文件的数据库的用户名和密码进行修改

·         DATABASE:·           db: ‘zkdash’·           host: ‘localhost’   # 修改为你的数据库地址·           port: 3306   # 设置端口号·           user: ‘root’   # 修改用户名·           passwd: ‘123456’  # 修改密码

设置完成后进行初始化数据库

cd zkdashpython ./bin/syncdb.py   # 注意执行路径必须为./bin/syncdb.py

说明:数据库使用mysql,创建表结构前请先配置数据库连接信息

  • 运行

·       cd zkdash·       python init.py -port=20001

说明:初次运行zkdash时需要到zookeeper管理菜单下增加监控的zookeeper集群ip信息

配置文件说明:

配置文件详细说明

数据库配置项(DATABASE)

  • db: 数据库名称
  • host: ip地址
  • port: 端口号
  • user: 用户名
  • passwd: 密码

全局配置项

  • USE_QCONF: 是否通过QConf获取zookeeper数据(使用该项可以提高树形展示配置信息的响应速度)

与QConf的搭配使用:

  • 反馈服务器地址:http://ip:port/api/v1/feedback(Agent同步状况查看依赖此反馈信息)

注意事项:

  1. 新增节点需要先指定父节点,并且只能逐级增加

当设置使用QConf获取zookeeper数据时,zookeeper管理菜单下的zookeeper集群名称需要与QConf 客户端Agent配置文件的idc名称一致

Centos安装Oracle客户端

从这里”http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html”下载以下三个文件

instantclient-basic-Linux.x64-11.2.0.4.0.zip

instantclient-sdk-linux.x64-11.2.0.4.0.zip

instantclient-sqlplus-linux.x64-11.2.0.4.0.zip

新建并复制到Oracle文件夹下,自然解压后,会生成“instantclient_11_2”目录,basicsqlplus会在其根下,而sdk会在其下生成“sdk”目录;在其下建立目录“/network/admin”,创建文件:“tnsnames.ora”,并添加:

ORCL =

 (DESCRIPTION =

   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.232.1)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl)

   )

 )

配置:”sudo gedit /etc/profile

export ORACLE_HOME=/root/instantclient_11_2

export PATH=$ORACLE_HOME:$PATH

export TNS_ADMIN=$ORACLE_HOME/network/admin

export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH

export NLS_LANG=’SIMPLIFIED CHINESE_CHINA.AL32UTF8′

 运行:“source /etc/profile”使之生效

执行:sqlplus /nolog

结果:

u@ubuntu:~$ sqlplus /nolog

SQL*Plus: Release 11.2.0.4.0 Production on星期二 3 31 23:35:222015

Copyright (c) 1982, 2013, Oracle. All rights reserved.

SQL>

    creating build/lib.linux-x86_64-3.5-11g

    gcc -pthread -shared build/temp.linux-x86_64-3.5-11g/cx_Oracle.o -L/root/instantclient_11_2 -lclntsh -o build/lib.linux-x86_64-3.5-11g/cx_Oracle.cpython-35m-x86_64-linux-gnu.so

    /usr/bin/ld: cannot find -lclntsh

    collect2: error: ld returned 1 exit status

    error: command ‘gcc’ failed with exit status 1

解决方法:ln -s /root/instantclient_11_2/libclntsh.so.11.1 /root/instantclient_11_2/libclntsh.so

centos7.2 python2.7.5升级到python3.5.2

安装必要的程序
yum install deltarpm
yum install openssl-devel
yum install sqlite-devel (python 中使用sqlite)

安装
0. yum install gcc
1. yum install wget
2. wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
3. tar -xf Python-3.5.2.tgz
4. cd Python-3.5.2
5. ./configure
6. make
7. make install

配置
1.mv /usr/bin/python /usr/bin/python2.7.5
2.解决升级后yum不能使用问题
vi /usr/bin/yum
把文件头部的#!/usr/bin/python改成#!/usr/bin/python2.7.5保存退出即可

vi /usr/libexec/urlgrabber-ext-down
把文件头部的#!/usr/bin/python改成#!/usr/bin/python2.7.5保存退出即可

3.将默认python改成3.5.2
ln -s /usr/local/bin/python3.5 /usr/bin/python

4.更新pip版本
rm /usr/bin/pip
ln -s /usr/local/bin/pip3 /usr/bin/pip
5.检测
python -V

常见错误:

make install时:

报错

/usr/bin/install -c -m 644 ./Tools/gdb/libpython.py python-gdb.py
gcc -pthread -c -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -I. -I./Include -DPy_BUILD_CORE -o Programs/_testembed.o ./Programs/_testembed.c
gcc -pthread -Xlinker -export-dynamic -o Programs/_testembed Programs/_testembed.o libpython3.6m.a -lpthread -ldl -lutil -lm
# Substitution happens here, as the completely-expanded BINDIR
# is not available in configure
sed -e "s,@EXENAME@,/usr/local/bin/python3.6m," < ./Misc/python-config.in >python-config.py
# Replace makefile compat. variable references with shell script compat. ones; ->
LC_ALL=C sed -e 's,\$(\([A-Za-z0-9_]*\)),\$\{\1\},g' < Misc/python-config.sh >python-config
# On Darwin, always use the python version of the script, the shell
# version doesn't use the compiler customizations that are provided
# in python (_osx_support.py).
if test `uname -s` = Darwin; then \
cp python-config.py python-config; \
fi

解决方法:

按提示执行:

>sed -e “s,@EXENAME@,/usr/local/bin/python3.6m,” < ./Misc/python-config.in >python-config.py
>LC_ALL=C sed -e ‘s,\$(\([A-Za-z0-9_]*\)),\$\{\1\},g’ < Misc/python-config.sh >python-config

Supervisor使用

转:

Supervisor是一个C/S系统,它可以在类UNIX系统上控制系统进程,由python编写,它提供了大量的功能来实现对进程的管理。

  1. 程序的多进程启动,可以配置同时启动的进程数,而不需要一个个启动
  2. 程序的退出码,可以根据程序的退出码来判断是否需要自动重启
  3. 程序所产生日志的处理
  4. 进程初始化的环境,包括目录,用户,umask,关闭进程所需要的信号等等
  5. 手动管理进程(开始,启动,重启,查看进程状态)的web界面,和xmlrpc接口

支持的平台

  • 可以运行在大多数类UNIX系统上,比如Linux、MAC OS X、Solaris、FreeBSD。
  • 不支持任何版本的Windows。
  • 支持Python2.4以及之后的版本,但不支持Python3 (在centos中可以像设置python3支持yum的方式通过修改其执行程序头中的python版本来进行兼容)。

安装

  • pip
    pip install supervisor
  • easy_install
    easy_install supervisor
  • apt-get (Debian/Ubuntu)
    apt-get update
    apt-get install supervisor
    #默认配置文件在/etc/supervisor/supervisord.conf
  • yum (Centos)
    yum install supervisor

创建配置文件

安装完成后,使用下面这两种方式创建默认的配置文件:

  • 使用root身份创建一个全局配置文件echo_supervisord_conf > /etc/supervisord.conf,supervisord程序在运行后会自动查找并加载此目录配置文件。
  • 在当前目录创建配置文件echo_supervisord_conf > supervisord.conf,然后使用-c参数在启动时手动指定配置文件:supervisord -c supervisord.conf

配置文件通常被命名为supervisord.conf,它被supervisord和supervisorctl两者使用。如果程序启动时没有包含-c参数(用于告诉程序加载指定的配置文件名),程序将会按照下列顺序查找supervisord.conf文件,然后使用首个查找到的文件作为结果。

  1. $CWD/supervisord.conf
  2. $CWD/etc/supervisord.conf
  3. /etc/supervisord.conf

默认配置文件echo_supervisord_conf内容:

; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
;
; Note: shell expansion ("~" or "$HOME") is not supported.  Environment
; variables can be expanded using this syntax: "%(ENV_HOME)s".

[unix_http_server]          ; supervisord的unix socket服务配置
file=/tmp/supervisor.sock   ; socket文件的保存目录
;chmod=0700                 ; socket的文件权限 (default 0700)
;chown=nobody:nogroup       ; socket的拥有者和组名
;username=user              ; 默认不需要登陆用户 (open server)
;password=123               ; 默认不需要登陆密码 (open server)

;[inet_http_server]         ; supervisord的tcp服务配置
port=*:9001        ; tcp端口   配置通过web进行访问
username=user              ; tcp登陆用户
password=123               ; tcp登陆密码

[supervisord]                ; supervisord的主进程配置
logfile=/tmp/supervisord.log ; 主要的进程日志配置
logfile_maxbytes=50MB        ; 最大日志体积,默认50MB
logfile_backups=10           ; 日志文件备份数目,默认10
loglevel=info                ; 日志级别,默认info; 还有:debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord的pidfile文件
nodaemon=false               ; 是否以守护进程的方式启动
minfds=1024                  ; 最小的有效文件描述符,默认1024
minprocs=200                 ; 最小的有效进程描述符,默认200
;umask=022                   ; 进程文件的umask,默认200
;user=chrism                 ; 默认为当前用户,如果为root则必填
;identifier=supervisor       ; supervisord的表示符, 默认时'supervisor'
;directory=/tmp              ; 默认不cd到当前目录
;nocleanup=true              ; 不在启动的时候清除临时文件,默认false
;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value       ; 初始键值对传递给进程
;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; 如果设置应该与http_username相同
;password=123                ; 如果设置应该与http_password相同
;prompt=mysupervisor         ; 命令行提示符,默认"supervisor"
;history_file=~/.sc_history  ; 命令行历史纪录

; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.

;[program:theprogramname]
;command=/bin/cat              ; 运行的程序 (相对使用PATH路径, 可以使用参数)
;process_name=%(program_name)s ; 进程名表达式,默认为%(program_name)s
;numprocs=1                    ; 默认启动的进程数目,默认为1
;directory=/tmp                ; 在运行前cwd到指定的目录,默认不执行cmd
;umask=022                     ; 进程umask,默认None
;priority=999                  ; 程序运行的优先级,默认999
;autostart=true                ; 默认随supervisord自动启动,默认true
;autorestart=unexpected        ; whether/when to restart (default: unexpected)
;startsecs=1                   ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 期望的退出码,默认0,2
;stopsignal=QUIT               ; 杀死进程的信号,默认TERM
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; 向unix进程组发送停止信号,默认false
;killasgroup=false             ; 向unix进程组发送SIGKILL信号,默认false
;user=chrism                   ; 为运行程序的unix帐号设置setuid
;redirect_stderr=true          ; 将标准错误重定向到标准输出,默认false
;stdout_logfile=/a/path        ; 标准输出的文件路径NONE=none;默认AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A=1,B=2           ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)

; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; 运行的程序 (相对使用PATH路径, 可以使用参数)
;process_name=%(program_name)s ; 进程名表达式,默认为%(program_name)s
;numprocs=1                    ; 默认启动的进程数目,默认为1
;events=EVENT                  ; event notif. types to subscribe to (req'd)
;buffer_size=10                ; 事件缓冲区队列大小,默认10
;directory=/tmp                ; 在运行前cwd到指定的目录,默认不执行cmd
;umask=022                     ; 进程umask,默认None
;priority=-1                   ; 程序运行的优先级,默认-1
;autostart=true                ; 默认随supervisord自动启动,默认true
;autorestart=unexpected        ; whether/when to restart (default: unexpected)
;startsecs=1                   ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 期望的退出码,默认0,2
;stopsignal=QUIT               ; 杀死进程的信号,默认TERM
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; 向unix进程组发送停止信号,默认false
;killasgroup=false             ; 向unix进程组发送SIGKILL信号,默认false
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups        ; # of stderr logfile backups (default 10)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A=1,B=2           ; process environment additions
;serverurl=AUTO                ; override serverurl computation (childutils)

; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.

;[group:thegroupname]
;programs=progname1,progname2  ; 任何在[program:x]中定义的x
;priority=999                  ; 程序运行的优先级,默认999

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

;[include]
;files = relative/directory/*.ini

添加一个程序

以shadowsocks为例,编辑配置文件supervisord.conf,在后面添加新程序

[program:shadowsocks]
command=ssserver -c /etc/shadowsocks.json
autostart=true
autorestart=true
user=nobody

启动

使用指定配置文件启动:supervisord -c supervisord.conf

使用默认配置文件启动:supervisord

重启:supervisorctl reload

设置开机启动:systemctl enable supervisord

验证是否是开机启动:systemctl is-enabled supervisord

常用命令

控制命令基本都通过supervisorctl执行,输入help可以看到命令列表。这是一些常用命令:

  • 获得所有程序状态 supervisorctl status
  • 关闭目标程序 supervisorctl stop spider
  • 启动目标程序 supervisorctl start spider
  • 关闭所有程序 supervisorctl shutdown