ืืื ืงืจืงืก ืืคืงืืืืช ืฉื ืืชื ืืืคืขืื ืืกืคืง ืืืืจืื ืืืื ืื ืฉื OnWorks ืืืืฆืขืืช ืืืช ืืชืื ืืช ืืขืืืื ืืืงืืื ืืช ืืืจืืืืช ืฉืื ื, ืืืื Ubuntu Online, Fedora Online, ืืืืืืืจ ืืงืืื ืฉื Windows ืื ืืืืืืืจ ืืงืืื ืฉื MAC OS
ืชึธืึฐื ึดืืช:
ืฉืึตื
ืงืจืงืก - ืชืืขืื ืงืจืงืก [ืชืืื ื]
Circus ืืื ืชืืื ืช Python ืืฉืจ ืืืืื ืืฉืืฉ ืื ืืืืจ ืืืงืจื ืฉื ืชืืืืืื ืืฉืงืขืื.
ื ืืชื ืืื ืืข ืืช ืืงืจืงืก ืืืืฆืขืืช ืืืฉืง ืฉืืจืช ืคืงืืื, ืืืฉืง ืืื ืืจื ื ืื ืืืืคื ืชืื ืืชื
ืืจื ื-API ืฉื python.
ืืื ืืืชืงืื ืืืชื ืืื ืกืืช ืืช ืืชืืื ืืช ืฉืื, ืขืืื ืืืืืืืืช, ืื ืงืจื ืืช ืฉืืจ ืืขืืื ืืื
ืืืืืจืืช ืืืืจื.
ืจืฅ A ืงืจืงืก ืืืืืื
ืงืจืงืก ืืกืคืง ืฉืืืช ืกืงืจืืคื ืืฉืืจืช ืืคืงืืื ืงืจืงืก ืฉื ืืชื ืืืฉืชืืฉ ืืื ืื ืืืื ืชืืืืืื
ืืืืจืื ืืฆืืคื ืืื ืื ืืืชืจ.
ืืื ืฉืืจืช ืืคืงืืื ืฉื Circus ื ืืชื ืืืืืจื ืืืืฆืขืืช ืงืืืฅ ืชืฆืืจื ืืกืื ืื ini.
ืื ื ืืืืื ืืืื ืืื ืืืืืช:
[ืฆืืคื:ืชืืื ืืช]
cmd = python myprogram.py
ืืกืคืจ ืชืืืืืื = 5
[ืฆืืคื: ืชืืื ืืช ืืืจืช]
cmd = ืชืืื ืืช ืืืจืช
ืืกืคืจ ืชืืืืืื = 2
ืืืืจ ืืื ืืงืืืฅ ืืืขืืจ ืื ืงืจืงืก:
$ circusd example.ini
ืืืื ืชืืืืืื, ืงืจืงืก ืืืื ืื ืืงืฉืืจ ืฉืงืขืื. ืืื ืื ืชืืืื ืืื ืืื ืขื ืืื ืงืจืงืก ืืื
ืื ืฉื ืืืื ืืงืจืงืก ืืจืืฉื, ืืืืืจ ืื ืชืืื ืืช ืฉื ืฉืืืช ืขื ืืื ืงืจืงืก ืืืืื
ืืืฉืชืืฉ ืืฉืงืขืื ืืืื.
ืืคืขืืช ืฉืงืข ืืื ืคืฉืืื ืืื ืืืกืคืช ื ืฉืงืข ืกืขืืฃ ืืงืืืฅ ืืชืฆืืจื:
[socket:mysocket]
ืืืจื = ืืืจื ืืงืืื
ืืฆืืื = 8080
ืืืืืข ื ืืกืฃ ืขื ืฉืงืขืื, ืจืื ืฉืงืขืื.
ืืื ืืืืื ืืื ืื ืชืืื ื ืงืืื ืืช, ืงืจื ืืื ืฉืงืขืื.
ืฉืืืื ืงืจืงืก
Circus ืืกืคืง ืฉื ื ืืืื ืืฉืืจืช ืคืงืืื ืื ืืืื ืืืืื ืืจืฅ ืฉืื:
ยท circusctl, ืงืื ืกืืืช ื ืืืื ืฉืื ืชืืื ืืืฉืชืืฉ ืืื ืืืฆืข ืคืขืืืืช ืืืื ืืืกืคื ืื
ืคืื ืื ืขืืืืื
ยท ืืืค ืงืจืงืก, ืงืื ืกืืื ืืืืืช ืขืืืื ืฉืื ืชืืื ืืืฉืชืืฉ ืืื ืืืฆืื ืืช ืืฉืืืืฉ ืืืืืจืื ืืืืขืื ืฉืื
ืืคืขืืช ืงืจืงืก.
ืืืืืข ื ืืกืฃ ืขื ืืื, ืจืื cli
Circus ืืฆืืขื ืื ืืื ืืืืื ืื ืืื ืืจื ืื ืฉืืืื ืืืชืืืจ ืืืืื Circus ืคืืขื ืืืืคืฉืจ ืื
ืืคืงื ืืืืฆืืจ ืืืชื ืืื ืืจืืงืฆืื.
ืืืืืข ื ืืกืฃ ืขื ืชืืื ื ืื, ืจืื circushttpd
ืื ืขึทืืฉืึธืื ?
ืื ืืชื ืืคืชื ืืจืืฆื ืืื ืฃ ืืช Circus ืืคืจืืืงื ืืฉืื, ืืชืื ืชืืกืคืื ืื
ืืืงืก, ืขืืืจ ืื fordevs.
ืื ืืชื ืืืคืจ ืืจืืฆื ืื ืื ืืช ืืชืืืืืื ืฉืื ืืืืฆืขืืช Circus, ืขืืืจ ื-forops.
ืชืจืืืืช ื ืึธืฉืืึนื
ืขืื ืขื ืชืจืืื: ืชืจืืืืช.
ืงืืฉืืจืื ืฉืืืืฉืืื:
ยท ืืฉ ืจืฉืืืช ืืืืืจ ืืื ืืฉืื ืื ืฉืืื:
http://tech.groups.yahoo.com/group/circus-dev/
ยท ืืืืืจ ืืืขืงื ืืืขืืืช ื ืืฆืืื ื-GitHub: https://github.com/circus-tent/circus
ยท ืืฆืืจืคื ืืืื ื ื-IRC : Freenode, ืขืจืืฅ #ืืืื ืงืจืงืก
ืชืืขืื ืืื
ืืชืงื ื ืงืจืงืก
Circus ืืื ืืืืืช Python ืืืชืคืจืกืืช ื- PyPI - ืืื ืืงืก ืืืืืืืช ืฉื Python.
ืืืจื ืืคืฉืืื ืืืืชืจ ืืืชืงืื ืืืชื ืืื ืืืฉืชืืฉ ื-pip, ืืื ืืืชืงื ื ืื ืืืื ืฉื Python
ืืืจ you
$ pip ืืืชืงืื ืงืจืงืก
ืื ืืืจื ืืช ื ืืจืืืื on PyPI, ืืืฅ ืืืชืงื ืืืชื ืืืืคื ืืื ื ืขื:
$ python setup.py ืืืชืงืื
ืื ืืชื ืจืืฆื ืื ืกืืช ืืช ืงืจืงืก, ืจืื ืืช ืืืืืืืืช.
ืื ืืชื ืืฉืชืืฉ ื-debian ืื ืืื ืืคืฆื ืืืืกืกืช debian, ืืชื ืื ืืืื ืืืฉืชืืฉ ื-ppa to
ืืืชืงืื ืงืจืงืก, ืื ื https://launchpad.net/~roman-imankulov/+archive/circus
ืื ืืืช zc.
ืื ื ืืกืคืงืื ืื ืืืช zc. ืชืฆืืจื, ืืชื ืืืื ืืืฉืชืืฉ ืื ืคืฉืื ืขื ืืื ืืคืขืืช ื-bootstrap
ืกืงืจืืคื, ืืื ืงืืจื buildout:
$ python bootstrap.py
$ bin/buildout
ืขืื on ืืจืืฉืืช
ืงืจืงืก ืขืืื ืขื:
ยท Python 2.6, 2.7, 3.2 ืื 3.3
ยท
zeromq >= 2.1.10
ยท ืืืจืกื ืฉื zeromq ืื ืชืืืช ื ืงืืขืช ืืกืืคื ืฉื ืืืจ ืืคื ืืืื ืืจืกื ืฉื
pyzmq ืืืชืงื ืขื ืืื pip ืืืืื ืืชืงื ืช ืงืจืงืก.
ยท ืืืืืืจื ืื ืืืืืช ืฉืืื ืชืืืืช ืืืจืกืืืช 2.x (ืืืืื), 3.x ื-4.x ZeroMQ.
ยท ืืขืจืืช: ืื ืืชื ืืฉืชืืฉ ื-PyPy ืืืงืื ื-CPython, ืืงืคื ืืงืจืื ืืืชื
ืืกืืื ืืชืงื ื ืืื ืชืืืื ืืืจืกืช ZeroMQ ืืื ื ืืื ื- PyPy.
ืืืฉืจ ืืชื ืืชืงืื ืงืจืงืก, ืืืจืกืืืช ืืขืืื ืืืช ืืืืชืจ ืฉื ืืชืืืช ืฉื Python ืืืฉืืคื
ืืฉืืืื.
ืืชื ืืืื ืื ืืืชืงืื ืืืชื ืืืืคื ืืื ื ืืืืฆืขืืช ืงืืืฅ pip-requirements.txt ืฉืื ื ืืกืคืงืื:
$ pip ืืชืงื ืช -r pip-requirements.txt
ืื ืืชื ืจืืฆื ืืืคืขืื ืืช ืงืื ืกืืืช ืืืื ืืจื ื ืชืฆืืจื ืืืชืงืื ืจืฉืช ืงืจืงืก:
$ pip ืืืชืงืื circus-web
ืืืจืื
ืฆืขื ืืืจ ืฆืขื ืืืจืื
ืืฉืืืื ืืืืืืืช ืืกืคืจืืื ืืืืืจ ืืงืจืงืก ืืืื ืืืืืืืช ืจืืืช ืืื ืืืฉืื ืืืชื
ืืชืืื, ืืื ืื ื ืืืจืื ืืื ืฉื ืืชื ืื ืกืงืืจื ืืืืืช ืฉื ืืชืืื ืืช.
ืื ืื ื ืืืืืื ืืคืงื ืขื ืืืฉืื WSGI.
ืึทืชืงึธื ึธื
Circus ื ืืืง ืขื Mac OS X ื-Linux ืขื ื-Python 2.6, 2.7, 3.2 ื-3.3 ืืขืืื ืืื ืืืืชืจ. ื
ืืืคืขืื ืงืจืงืก ืืื, ืชืฆืืจื ืื libzmq, ืืืื & ืืืจืืืืื.
ืืืขืจืืืช ืืืืกืกืืช ืืืืื:
$ sudo apt-get install libzmq-dev libevent-dev python-dev python-virtualenv
ืฆืืจ Virtualenv ืืืชืงื ืงืจืงืก, ืจืฉืช ืงืจืงืก ื ืึถืจึถื ืึผืึน
$ virtualenv /tmp/circus
$ cd /tmp/circus
$ bin/pip ืืืชืงืื ืงืจืงืก
$ bin/pip ืืชืงื ืช circus-web
$ bin/pip ืืืชืงืื chausset
ืืจืืข ืฉืื ื ืขืฉื, ืชืืฆื ืฉืคืข ืฉื ืคืงืืืืช ื-bin dir ืืืงืืื.
ื ืึนืึธื
ืึถืจึถื ืืืืข ืขื ืืคืืืงืฆืืืช Hello world, ื ืกื ืืืคืขืื ืืืชื:
ืคื/ืฆ'ืืกืื $
ืืชื ืืืืจ ืืืืืช ืืกืืื ืืืงืจ http://localhost: 8080 ืืืจืืืช ืฉืืื ืขืึนืึธื.
ืขืฆืืจ ืืช Chaussette ืืืืกืฃ ืงืืืฅ circus.ini ืืกืคืจืืื ืืืืืื:
[ืงืจืงืก]
ืกืืืืกืืืงื = 1
httpd = 1
[watcher:webapp]
cmd = bin/chaussette --fd $(circus.sockets.web)
ืืกืคืจ ืชืืืืืื = 3
use_sockets = ื ืืื
[socket:web]
ืืืจื = 127.0.0.1
ืืฆืืื = 9999
ืงืืืฅ ืืชืฆืืจื ืืื ืืืืจ ืืกืืจืงืืก ืืืื ืฉืงืข ืืืฆืืื 9999 ืืืืคืขืื 3 ืขืืืื ืฆ'ืืกืืก
ื ืื ืื. ืื ืื ืืคืขืื ืืช ืืื ืืืืืื ืื ืืืื ืืจื ื ืฉื Circus ืืืช ืืืืื ืืกืืืืกืืืงื.
ืฉืืืจ ืืืชื ืืืคืขื ืืืชื ืืืืฆืขืืช ืงืจืงืก:
$ bin/circusd --daemon circus.ini
ืขืืฉืื ืืงืจ http://127.0.0.1: 9999, ืืชื ืืืืจ ืืจืืืช ืืช ืืคืืืงืฆืืืช hello world. ืืืืื ืืขืช ืืื
ืฉืืฉืงืข ืื ืืื ืขื ืืื Circus ืืืฉ ืืื ืขืืืื ืืื ืืจื ื ืฉืืงืืืื
ืงืฉืจืื ื ืืื.
ืืขืจื:
ืืืืื ืืขืืืก ืืืคืขื ืขื ืืื ืืขืจืืช ืืืคืขืื ืื ืฉืืชื ืืงืื ืืช ืืืชื ืืืืจืืช
ืืื ืื ืฉืจืช ืืื ืืจื ื ืืืจ ืืจืืฉ ืืื Apache ืื NGinx. ืงืจืงืก ืื ืืคืจืืข
ืื ืชืื ืื ืฉืขืืืจืื.
ืืชื ืืืื ืื ืืืงืจ http://localhost: 8080 / ืืชืืื ื ืืืื ืืืืืื ืื ืืืื ืืจื ืื ืฉื Circus.
ืคืขืืืช ืืืืืื
ืืืื ื ืฉืชืืฉ ืืืขืืคืช circusctl ืืืื ืฉืืืขืจืืช ืคืืขืืช:
$ bin/circusctl
circusctl 0.7.1
circusd-stats: ืคืขืื
circushttpd: ืคืขืื
webapp: ืคืขืื
(circusctl)
ืืชื ื ืื ืก ืืืขืืคืช ืืื ืืจืืงืืืืืช. ืกืึผื ืืขืืืจ ืืื ืืงืื ืืช ืื ืืคืงืืืืช:
(circusctl) ืขืืจื
ืคืงืืืืช ืืชืืขืืืช (ืืงืื ืขืืจื ):
========================================
ืืืกืฃ ืงืื ืจืฉืืื numprocesses quit rm start stop
decr globaloptions ืืืืื ื numwatchers ืืขื ืืืืฉ ืกื ืกืืืืกืืืงืืช
dstats incr listsockets ืืคืฉืจืืืืช ืกืืืืก ืืืช ืืคืขืื ืืืืฉ
ืคืงืืืืช ืื ืืชืืขืืืช:
======================
ืขืืจื ืฉื EOF
ืืืื ื ื ืกื ืืืจืื ืืกืืกืืื. ืืืื ื ืจืฉืื ืืช ืืชืืืืืื ืฉื Web Workers ืื ืืกืืฃ ืืื ืืืฉ:
(circusctl) ืจืฉืืืช webapp
13712,13713,13714
(circusctl) incr webapp
4
(circusctl) ืจืฉืืืช webapp
13712,13713,13714,13973
ืืื ืืื, ืืฆืจืช ืืื ืืจืืงืฆืื ืขื ืืงืจืงืก ืฉืื! ืจืื ืืืงืืืคื ืขื Ctrl+D ืืขืืฉืื ืืคืขื
ืืืค ืงืจืงืก:
$ ืคื/ืขืืืื ืงืจืงืก
ืืืื ืคืงืืื ืืืืืช-ืขื ืืื ืืฆืคืืช ืืื ืืืืืจืื ืืืฉืืืืฉ ื-CPU ืฉื ืื ืืชืืืืืื ืฉืื ืืืื ืืืช.
ืืืฅ ืขื Ctrl+C ืืขืืฉืื ืืื ื ืฆื ืืกืืจืงืืก ืืืืืืื ืืืืฆืขืืช circus-ctl:
$ bin/circusctl ืขืืื
ok
ืึทืึผึธื ืฆืขืืื
ืืชื ืืืื ืืืืจ ืืช ืืคืืืงืฆืืืช WSGI ืืฉืื ืืืงืื ืืช ืฉืืื ืืขืืื ืฉื Chaussette ืคืฉืื ืขื ืืื
ืืคื ื ืืช ืืืืฉืื ืฉื ืืชื ืืงืจืื.
Chaussette ืืืืขื ืื ืขื ืืืงืื ืืืืจืืื ืจืืื ืืื Gevent ืื Meinheld.
ืืืืจ ืขืืื ื https://chaussette.readthedocs.org/ ืืื ืืืคืฉืจืืืืช.
ืืื ืฆืจืื I ืืืฉืชืืฉ ืงืจืงืก ืืืงืื of X ?
1. ืงืจืงืก ืืคืฉื ืฉืึถืึฐืึธ ืืื ืืจื ื ืืขืจืื ืชืืืื ื ืืืื
ืงืจืงืก ืืืืข ืื ืื ืชืืืืืื ื ืฉืงืขืื, ืื ืฉืื ืชืฆืืจื ืืืืฆืื ืืื ืืจื ื
ื ืืืื ืขืืืืื ืืฉืจืช WGSI.
ืจืื ืืื ืฉืงืขืื
2. ืงืจืงืก ืืกืคืง ืคืื/ืชืช ื ืื ืืืืขืืช ืืืืฆืขืืช ZeroMQ
ืืงืจืงืก ืืฉ ืคืื/ืขืจืืฅ ืืฉื ื ืฉืืชื ืืืื ืืืืจืฉื ืืืื. ืขืจืืฅ ืื ืืงืื ืืช ืื ืืืืจืืขืื
ืงืืจื ืืงืจืงืก. ืืืืืื, ืืชื ืืืื ืืงืื ืืืืขื ืืืฉืจ ืชืืืื ืืชื ืืคืฃ, ืื
ืืื ืืช ืืงืื ืฉืืคืขืื ืืืืจื ืืืฉืจ ืชืืืืืื ืืกืืืืื ืืืืืื ืืช ืื ืืืขืื ืื
ืืืืจืื RAM
ืืืจืืขืื ืืื ื ืฉืืืื ืืจื ืขืจืืฅ ZeroMQ, ืื ืฉืขืืฉื ืืืชื ืฉืื ื ืื-stdin
ืืคืงื ืืืจื ืืฉืชืืฉ ื:
ยท ืงืจืงืก ืฉืืื ืืืจืืขืื ืืฆืืจื ืฉื ืืฉ ืืฉืื, ืื ืฉืืื ืฆืืจื ืืืฆืข ืืืืื ืืื ืืช
ืืจื ืืช ืื ืืืืื ืื ืืืฉืืืจ ืขื ืืืื ืืชืืื.
ยท ื ืืชื ืืืชืจ ืื ืืืื ืขื ืืืจื ืืจืืืง.
Circus ืืกืคืงืช ืื ืืจืืื ืืงืื ืขืืืื ื ืกืืืืก ืืืืฆืขืืช ืกืงืจืื ืื-ืคืขืืืื ืขื ืืจืืฉื/ื ืฆืื
ืขึธืจืึผืฅ. ืื ืืืืจ ืฉืืชื ืืืื ืืงืื ืืช ืืืืืข ืฉืื ืืืื ืฉืชืฆืืจื ืืืืจืฉื ื-a
ืืจื. ืืคืงืืื cli ืฉืืกืคืงืช Circus ืืฉืชืืฉืช ืืขืจืืฅ ืืื.
ืจืื ืืืืืืืช.
3. ืงืจืงืก is (ืคึผึดืืชืึนื) ืืคืชืืื ืืืืืืชื
ืืขืื ืฉ-Circus ืืืื ืืืืืช ืืื ืข ืืืื ืขื ืืื ืงืืืฅ ืชืฆืืจื ืื- circusctl / ืงืจืงืก
ืคืงืืืืช, ืงื ืืขืฉืืช ืฉืืืืฉ ืืืืจ ืืื ืืืขืจืืช ืื ืืืืงื ืืื ืืื ืืช ืืชืืื ืืืฉืืช ืืฉืื
ืฆืืคื ืชืืืื ื- Python.
ืื ืฉืืื ืฉื ืืืขืจืืช ืืืืืืช, ืื ืฉืชืืื ืืขืฉืืช ืฉืืืืฉ ืืืืจ ืืืืคื ืขืฆืืื:
ยท ืืขืืคืช ืืชืืืื (ืืชึทืึฒืึดืื)
ยท ืื ืื ืืชืืืืืื (ืฆืืคื)
ยท ืืื ืื ืืืืืืื ืฉืื ืื ืืกืคืจ ืื ืืื ืชืืืืืื (ืฉืืืจ)
ยท ืืืืืโฆ
4. ืงืจืงืก ืืืื ืืื
ืืื ืืืงืจื ืืฉืืืืฉ ืฉื Circus ืืื ืื ืื ืืืคื ืชืืืืืื ืืื ืืืกืคื
ืชืงืืจื -- ืื ื ืืืืืืื ืืืชืืงื ืืื.
ืืืื ืืื ื- ืืคืงื
Supervisor ืืื ืคืชืจืื ืคืืคืืืจื ืืืื ืืขืืื Python ืืื ืื ื ื ืฉืืืื ืืขืชืื ืงืจืืืืช ืืื Circus
ืืฉืืื ืืืชื.
ืื ืืชื ืื ื ืืคืงื, ืืฃ ืื ืื ืกื ืืชืช ืกืงืืจื ืืืืืช ืฉื ืืืคื ืืฉืืืืฉ ืืืืื
ืฉืื ืืช.
ืืืืืื ืกืงืืจื
ืืืคืงื ืืืงืจืงืก ืืฉ ืืืชื ืืืจืืช - ืื ืื ืืืืช ืชืืืืืื ืืืกืคืงืืช ื
ืกืงืจืืคื ืฉืืจืช ืืคืงืืื - ืืืชืืื ืึฐืคึทืงึตืึท ื ืงืจืงืก - ืฉืงืืจื ืชืฆืืจื
ืงืืืฅ, ืืืื ืชืืืืืื ืืืฉืื ืืฉืืืจ ืืืชื ืืืืื.
ืืงืจืงืก ืืฉ ืชืืื ื ื ืืกืคืช: ืืืืืืช ืืืื ืฉืงืขืื ืืืชืช ืืชืืืืืื ืฉืืื ืื ืื
ืืืฉืชืืฉ ืืื. ืืืื "ืงืื-ืืืื" ืื ืืฉืืฉ ืฉืจืชื ืืื ืืจื ื ืจืืื ืืืืฅ, ืืื ืึทืคึธึผืฉื or
ืื-ืงืจื. ืืคืฉืจืืช ืื ื-Circus ืืืืื ืืคืฉื ืขืจืืืช ืืคืืืงืฆืืืช ืืื ืืจื ื: ืื ืืชืืืืืื ื
ืฉืงืขืื ืื ืืืืื ืขื ืืื ืืื ืืื.
ืฉื ื ืืคืจืืืงืืื ืืกืคืงืื ืืจื ืืฉืืื ืืืืื ืคืืขื ืืืืฆืขืืช ืกืงืจืืคื ืืืจ. ืืืชืืื
ืืคืงื ื circusctl. ืืฉื ืืื ืืฉ ืื ืืืจืืขืื ืืืจื ืืืืจืฉื ืืืืื.
ืืืืื ืืขืืงืจื ืืื ืืืื ืืืืืื ืืืกืืกืืช: Supervisor ืืฉืชืืฉ ื-XML-RPC ืืืื ืืจืืงืฆืื
ืขื ืืืืื, ืืขืื ืฉืกืืจืงืืก ืืฉืชืืฉ ื-ZeroMQ.
ื-Circus ืื-Supervisor ืืฉ ืืืฉืง ืืื ืืจื ืื ืืื ืืืฆืื ืืช ืืืชืจืืฉ. ืงืจืงืก ืื ืืืชืจ
ืืชืงืื ืื ืืชื ืืืื ืืขืงืื ืืืื ืืืช ืืืจ ืืืชืจืืฉ ืืืงืืื ืืื ืืจืืงืฆืื ืขื ืืืืื.
ืืื ืืฉืชืืฉ ืืฉืงืขื ืืื ืืจื ื ืืืคืืชื ืืคืจืืืงื ื ืคืจื (ืจืฉืช ืงืจืงืก.)
ืืฉื ื ืืืืืื ืขืืื ืื ืจืืื ืืืจืื ืืขืืฆืื ืืืืื, ืืืื ื ืคืจื ืืื ืืื ืืื... ื
ืืื ืชืืื, ืืชื ืืืื ืืืืื ืขืื ืขื ืคื ืืืืืช ืงืจืงืก ืืขืืฆืื.
ืชึฐืฆืึผืจึธื
ืฉืชื ืืืขืจืืืช ืืฉืชืืฉืืช ืืงืืืฅ ืืืื ini ืืชืฆืืจื.
ยท ืืคืงื ืชืืขืื
ยท ืงืจืงืก ืชืืขืื
ืื ื ืืืืื ืงืื ื ืืืคืขืืช ืืคืืืงืฆืื ืขื Supervisor. ืืืงืจื ืื, ื
ืืืืฉืื ืืืคืขื ืืืืคืขื ืืืืฉ ืืืงืจื ืฉืืื ืงืืจืก
[ืชืืื ืืช:ืืืืื]
command=npm start
directory=/home/www/my-server/
user=www-data
ืืชืืื ืืืืืืืืช = ื ืืื
autorestart=true
redirect_stderr=ื ืืื
ืืงืจืงืก, ืืืชื ืชืฆืืจื ื ืขืฉืืช ืขื ืืื:
[ืฆืืคื:ืืืืื]
cmd=npm ืืชืืื
working_dir=/home/www/my-server/
user=www-data
stderr_stream.class=StdoutStream
ืฉืืื ืื ืฉืื ืืชืื ืืืืฉ ืฉื stderr ืฉืื ื ืืืงืฆืช ื-Circus. ืืืื ืืื
a ืื ื ืชืืื ื ืืื ื-Supervisor, ืืื ืชืืคืฉืจ ืื ืืืืจ ืื ืคืืกืช ืงืื ืืืชืืืื ืืืชื
ืืืจื ืื ืื ืก. ืืชื ืืืื ืืืฆืืจ ืืืง ืืจืืื ืืฉืื (ืืืืชื) ืืืขืฉืืช ืื ืฉืืชื
ืจืืฆื ืขื ืืืจื ืื ืื ืก. Circus ืืกืคืง ืืื ืฉืืขืืจื ืืจื ืืืื ืื ืืื
StdoutStream, ืืจื ืงืืืฅ, WatchedFileStream, ืื TimedRotatingFileStream.
ืงืจืงืก ื Ops
ืืืืจื:
ืืืจืืจืช ืืืื, Circus ืืื ื ืืืืื ืืช ืืืืืขืืช ืฉืื ืืขืช ืฉืืืืช ืืืืข ืืจื ZeroMQ.
ืืคื ื ืืคืขืืช Circus ืืกืืืืช ืืคืงื, ืืงืคื ืืงืจืื ืืช ืืฃ ืืืืืื.
ืืฆืขื ืืจืืฉืื ืื ืืืื ืืืื ืกืืจืงืืก ืืื ืืืชืื ืืช ืงืืืฅ ืืชืฆืืจื ืฉืื. ืึดืจึฐืืึนืช
ืชึฐืฆืึผืจึธื. ืื ืืชื ืคืืจืก ืขืจืืืช ืืื ืืจื ื, ืขืืื ืืฉืงืขืื.
ื ืืชื ืืคืจืืก ืืช Circus ืืืืฆืขืืช Python 2.6, 2.7, 3.2 ืื 3.3 - ืจืื ืืคืจืืกืืช ืืืืฅ
ื ืขืฉื ื-2.7. ืืื ืืืืื ืืืฆื ืืคืจืืก ืืช Circus, ืืืืง ืืช ืืคืจืืกื.
ืืื ืื ืื ืืืื ืงืจืงืก, ืขืืื ืืืืืจ ืืช ืจืฉืืืช ืืคืงืืืืช ืฉืืื ืืชื ืืืื ืืืฉืชืืฉ
in circusctl. ืฉืื ืื ืฉืืชื ืืืื ืืงืื ืืช ืืืชื ืขืืจื ืืืื ืืจื ื ืืฉืืชื ืจืฅ circusctl ืืชืืจ
ืฆืืฃ.
ืื ื ืืกืคืงืื ืื ืืืค ืงืจืงืก, ืจืื cli ืืืื ืืืืื ืื ืืื ืืจื ืื ื ืืื. ืจืื circushttpd.
ืืืกืืฃ, ืืื ืืืคืืง ืืช ืืืจื ืืกืืจืงืืก, ืืงืคื ืืืืืง ืืืฆื ืืืฉืชืืฉ ืืชืืกืคืื ืื-hooks.
ืจืื ืชืืกืคืื ืืืืงืก.
Ops ืชืืขืื ืืื
ืชึฐืฆืึผืจึธื
ื ืืชื ืืืืืืจ ืืช Circus ืืืืฆืขืืช ืงืืืฅ ืชืฆืืจื ืืกืื ืื ini.
ืืืืื:
[ืงืจืงืก]
check_delay = 5
ื ืงืืืช ืงืฆื = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
include = \*.more.config.ini
umask = 002
[ืฆืืคื:ืืชืืื ืืช ืฉืื]
cmd = ืคืืชืื
args = -u myprogram.py $(circus.wid) $(CIRCUS.ENV.VAR)
delay_warmup = 0
ืืกืคืจ ืชืืืืืื = 5
# ืื
hooks.before_start = my.hooks.control_redis
# ืืืืืฃ ื-test.log ืืช ืืืจื ืื 300 ืืืคืืืช ืืฉื ืืื
stdout_stream.class = FileStream
stdout_stream.filename = test.log
# ืืืคืฆืืื ืื ืืกืืื ืืช ืงืืืฅ ืืืืื ืืืฉืจ ืืื ืืืืข ื-1 GB
# ืืฉืืืจ 5 ืขืืชืงืื ืฉื ืงืืฆืื ืืกืืืืื
stdout_stream.max_bytes = 1073741824
stdout_stream.backup_count = 5
[env:myprogram]
PATH = $PATH:/ ืกื
ืขืืื = ืฉืงืจ
[plugin:statsd]
use = circus.plugins.statsd.StatsdEmitter
ืืืจื = ืืืจื ืืงืืื
ืืฆืืื = 8125
sample_rate = 1.0
application_name = ืืืืื
[socket:web]
ืืืจื = ืืืจื ืืงืืื
ืืฆืืื = 8080
ืงืจืงืก - ืืืื ืกืขืืฃ
ื ืงืืืช ืกืืื
ืฉืงืข ZMQ ืืืฉืืฉ ืื ืืืื Circus ืืืืฆืขืืช circusctl. (ืึผึฐืจึดืืจึทืช ืึถืืึธื:
tcp://127.0.0.1:5555)
endpoint_owner
ืื ืืืืืจ ืืฉื ืืฉืชืืฉ ืืขืจืืช ืื ืงืืืช ืืงืฆื ืืื ืฉืงืข ipc ืืื
ipc://var/run/circusd.sock, ืื ืืืขืืืช ืขื ืงืืืฅ ื-socket ืชืฉืชื ื ื
ืืืชื ืืฉืชืืฉ ืืขืช ืืืคืขืื. ืืคืจืืื ื ืืกืคืื, ืจืื ืืืืื. (ืืจืืจืช ืืืื: ืืื)
pubsub_endpoint
ืฉืงืข PUB/SUB ืฉื ZMQ ืืงืื ืคืจืกืืืื ืฉื ืืืจืืขืื. (ืึผึฐืจึดืืจึทืช ืึถืืึธื:
tcp://127.0.0.1:5556)
papa_endpoint
ืื ืืชื ืืฉืชืืฉ ื-papa, ืืชื ืืืื ืืฆืืื ืืช ื ืงืืืช ืืงืฆื, ืืืื ipc://var/run/circusd.sock.
(ืึผึฐืจึดืืจึทืช ืึถืืึธื: tcp://127.0.0.1:20202)
ืกืืืืกืืืงื ืื ืืืืืจ ื-True, Circus ืืจืืฅ ืืช ืืืื circusd-stats. (ืืจืืจืช ืืืื: False)
stats_endpoint
ืฉืงืข PUB/SUB ืฉื ZMQ ืืงืื ืคืจืกืืืื ืฉื ืกืืืืกืืืงืืช. (ืึผึฐืจึดืืจึทืช ืึถืืึธื:
tcp://127.0.0.1:5557)
statsd_close_outputs
If True ืฉืืื ืืช circusd-stats stdout/stderr ืื /dev/null. (ืืจืืจืช ืืืื: False)
check_delay
ืืจืืื ืืกืงืจ ืืฉื ืืืช ืขืืืจ ืฉืงืข ZMQ. (ืืจืืจืช ืืืื: 5)
ืืืืื
ืจืฉืืื ืฉื ืงืืฆื ืชืฆืืจื ืฉืืฉ ืืืืื. ืืชื ืืืื ืืืฉืชืืฉ ืืชืืืื ืืืืืื (*) ืืืืื ืคืจื
ืกืืืืืช ืขืืืจ ืืงืืฆืื ืฉืื. ืื ืชืืืื ืื ืืืืืืื ืื ืืืกืืื ืืงืืืฅ ืืชืฆืืจื.
(ืืจืืจืช ืืืื: ืืื)
include_dir
ืจืฉืืืช ืกืคืจืืืช ืชืฆืืจื. ืื ืืงืืฆืื ืชืืืืื *.ini ืืชืืช ืืื ืกืคืจืืื
ืืืืืื. ืื ืชืืืื ืื ืืืืืืื ืื ืืืกืืื ืืงืืืฅ ืืชืฆืืจื. (ืึผึฐืจึดืืจึทืช ืึถืืึธื:
ืืฃ ืืื)
stream_backend
ืืืืืจ ืืช ืกืื ืืงืฆื ืืขืืจืคื ืืฉืืืืฉ ืขืืืจ ืืกืืจืืืื ื. ืขืจืืื ืืคืฉืจืืื ืื ืืื
or gavt. (ืืจืืจืช ืืืื: ืฉืจืฉืืจ)
ืขืืืื_ืืืืื
ืืืจืืื ืืฉื ืืืช ืืื ืฉื ื ืฆืืคืื ืืชืืื. ืืืื ืืืืืช ืืื ื. (ืืจืืจืช ืืืื: 0)
httpd ืื ืืืืืจ ื-True, Circus ืืจืืฅ ืืช ืืืื circushttpd. (ืืจืืจืช ืืืื: False)
httpd_host
ืืืืจื ืจืฅ ืขื ืืื ืืืืื circushttpd. (ืืจืืจืช ืืืื: localhost)
httpd_port
ืื ืื ืื ืืื ืขื ืืื ืืืืื circushttpd. (ืืจืืจืช ืืืื: 8080)
httpd_close_outputs
ืื ื ืืื, ืฉืืื ืืช ื-circushttpd stdout/stderr ืื /dev/null. (ืืจืืจืช ืืืื: False)
ืืืืื ืื ืืืืืจ ื-True, ืื ืืืืื ืื ืฉื Circus stout/stderr ืื ืืชืืื ื-circusd
stdout/stderr (ืืจืืจืช ืืืื: False)
debug_gc
ืื ืืืืืจ ื-True, circusd ืืืฆืื ืืืืข ืืืื ื ืืกืฃ ืืืืกืคื ืืืฉืคื.
ืื ืืืื ืืืืืช ืฉืืืืฉื ืืืขืงื ืืืจ ืืืืคืืช ืืืืจืื. (ืืจืืจืช ืืืื: False)
pidfile
ืืงืืืฅ ืฉืืฉ ืืืฉืชืืฉ ืื ืืื ืืฉืืืจ ืขื ื-demon pid.
ืืืืกืง ืขืจื ืขืืืจ umask. ืื ืื ืืืืืจ, circusd ืื ืื ืกื ืืฉื ืืช ืืช umask.
ืจืืช ืืืื
ืจืืช ืืืืื ืฉืื ื ืจืืฆืื ืืจืืืช (ืืจืืจืช ืืืื: INFO)
ืคืื ืืืื
ืงืืืฅ ืืคืื ืฉืื ืื ื ืจืืฆืื ืืืืื ืก (ืืจืืจืช ืืืื: - ืืื ืืืืื ืก ื-stdout). ืืชื ืืืื
ืืชืืืจ ื-syslog ืืจืืืง ืืืืฆืขืืช ืืชืืืืจ ืืื:
syslog://host:port?facility ืืืฉืจ ืืืืจื ืืื ืฉืจืช ื-syslog ืฉืื, ืืืฆืืื ืืื ืืืคืฆืืื ืืืช
ื-facility ืืื ืืชืงื ื-syslog ืืฉืืืืฉ. ืื ืืจืฆืื ื ืืืืื ืก ื-syslog ืืงืืื
ืืชื ืืืื ืืืฉืชืืฉ syslog:///path/to/syslog/socket?facility ืืืงืื.
loggerconfig
ื ืชืื ืืงืืืฅ INI, JSON ืื YAML ืืื ืืืืืืจ ืจืืฉืื Python ืกืื ืืจืื ืขืืืจ
ืคึผืึนืกึตืง. ืืขืจื ืืืืืื "ืืจืืจืช ืืืื" ืืฉืชืืฉ ืืชืฆืืจืช ืืจืืฉืื ืืืืื ืืช
ืืืชืืกืก ืขื ืืคืฉืจืืืืช ืืืืื ืืืืคืฆืืื ืืืืช ืืืคืฉืจืืืืช ืคืื ืืืื.
ืืืืื ืืื ืชึฐืฆืึผืจึธื ืฉืื
ืืจืกื: 1
disable_existing_loggers: false
ืืขืฆืืื:
ืืคืฉ you
ืคืืจืื: '%(asctime)s - %(name)s - [%(levelname)s] %(message)s'
ืืืคืืื:
ืงืืืฅ ืืื:
ืืืืงื: logging.FileHandler
ืฉื ืืงืืืฅ: logoutput.txt
ืจืื: DEBUG
ืคืืจืื: ืคืฉืื
ืืืจืชืื:
ืงืจืงืก:
ืจืื: DEBUG
ืืืคืืื: [logfile]
ืืืคืืฅ: ืื
ืฉืืจืฉ:
ืจืื: DEBUG
ืืืคืืื: [logfile]
ืฆืืคื:NAME - as ืจื ืกืขืืคืื as ืืชื ืจืืฆื
ืฉืึตื ืฉื ืืฆืืคื. ืฉื ืื ืืฉืืฉ ื circusctl
cmd ืชืืื ืืช ืืืคืขืื ืืืคืขืื.
ืืืขื ืืจืืืื ืืื ืืฉืืจืช ืืคืงืืื ืืืขืืืจ ืืชืืื ืืช. ืืชื ืืืื ืืืฉืชืืฉ ืืคืืจืื python
ืชืืืืจ ืืื ืืื ืืื ืืช ืืช ืืคืจืืืจืื. ืืฉืชื ื ืกืืืื ืืืื ืื, ืืื
ืืื ืื ืืืื ืืขืืื ืืืฉืชื ื ืืกืืืื ืฉืืขืืจืช, ืื ืืฉ,
ืขื ืืคืจืืืจ "env". ืึดืจึฐืืึนืช ืขืืฆืื ืื ืืื ืคืงืืืืช ื ืืืขืื ืื ืขื ืืื ืื
ืืฉืชื ืื ืืืืืข ื ืืกืฃ ืขื ืื.
ืคึผึธืึธื ืื ื ืืื, ืืชืืืืืื ืืืคืขืืื ืืืขืืคืช (ืืจืืจืช ืืืื: False)
shell_args
ืืจืืืื ืืื ืืฉืืจืช ืืคืงืืื ืืืขืืืจ ืืคืงืืืช ืืืขืืคืช ืืืฉืจ ืคึผึธืึธื ื ืืื. ืขืืื
ืจืง ืขืืืจ ืืขืจืืช *nix (ืืจืืจืช ืืืื: ืืื)
working_dir
ืื ืื ืืขืืืื ืฉื ืืชืืืืืื (ืืจืืจืช ืืืื: ืืื)
uid ืืืื ืืืฉืชืืฉ ืื ืืฉื ืฉืืืชื ืืคืงืืื ืืืืจื ืืคืขืื. (ื-uid ืื ืืืื ืืื
ืึผึฐืจึดืืจึทืช ืึถืืึธื).
gid ืืืื ืืงืืืฆื ืื ืืฉื ืฉืืืชื ืืคืงืืื ืืืืจื ืืคืขืื. (ื-Gid ืื ืืืื ืืื ื
ืึผึฐืจึดืืจึทืช ืึถืืึธื).
copy_env
ืื ืืืืืจ ื-true, ืืฉืชื ื ืืกืืืื ืืืงืืืืช ืืืขืชืงื ืืืขืืจื ื-
ืขืืืืื ืืฉืื ืืืืืื ืืืชื. (ืืจืืจืช ืืืื: False)
copy_path
ืื ืืืืืจ ื-true, sys.path ืืืขืืจ ืืกืืืืช ืชืช-ืืชืืืื ืืืืฆืขืืช PYTHONPATH.
copy_env ืืืื ืืืืืช ื ืืื. (ืืจืืจืช ืืืื: False)
ืขืืืื_ืืืืื
ืืืฉืืื (ืืฉื ืืืช) ืืื ืชืืืืืื ืืคืืขืืื.
ืืชืืื ืืืืืืืืช
ืื ืืืืืจ ื-false, ืืฆืืคื ืื ืืืคืขื ืืืืืืืืช ืืืฉืจ ืืืืจืจ
ืืชืืื. ื ืืชื ืืืคืขืื ืืช ืืฆืืคื ืืืคืืจืฉ (ืืืืืื: circusctrl ืืชืืื
ืืชืืื ืืช ืฉืื). (ืืจืืจืช ืืืื: ื ืืื)
ืืกืคืจ ืชืืืืืื
ืืกืคืจ ืืชืืืืืื ืืืคืขืื ืขืืืจ ืืฆืืคื ืืื.
rlimit_LIMIT
ืืืืจ ืืืืืช ืืฉืืืื LIMIT ืขืืืจ ืืชืืืืืื ืฉื ืฆืคื. ืฉื ืืชืฆืืจื ืฆืจืื ืืืชืืื
ืืงืืืขืื RLIMIT_* (ืื ืชืืืื ืจืืฉืืืช) ืืจืฉืืืื ื- ืคืืชืื ืืฉืื ืืืืื
ืืคื ืื. ืืืืืื, ืฉืืจืช ืืชืฆืืจื 'rlimit_nofile = 500' ืืืืืจื ืืช ืืืงืกืืืื
ืืกืคืจ ืืงืืฆืื ืืคืชืืืื ื-500. ืืื ืืืืืืจ ืขืจื ืืืืื ื-RLIM_INFINITY, ืื ืชืืืืจ
ืขืจื, ืืื ืฉืืจืช ืืชืฆืืจื ืืื: 'rlimit_nofile = '.
stderr_stream.class
ืฉื ืืืชืช Python ืืืกืื ืืืืืื ืฉืืืฆื ืืืงืื
ืื ืืื ืกืืืจืจ ืืจื ืฉื ืื ืืชืืืืืื ืื __ืฉืึดืืึธื__() ืฉืึดืืึธื.
Circus ืืกืคืง ืืื ืฉืืขืืจื ืืจื ืฉืืื ืืชื ืืืื ืืืฉืชืืฉ ืืื ืงืืืืืช:
ยท ืืจื ืงืืืฅ: ืืืชื ืืงืืืฅ ืืืืื ืืืฆืข ืกืืืื ืืืื ืืืืืืื
ยท WatchedFileStream: ืืืชื ืืงืืืฅ ืืืกืชืื ืขื ืกืืืื ืืืื ืืืฆืื ื
ยท TimedRotatingFileStream: ืืืชื ืืงืืืฅ ืืืืื ืืกืืื ืืืื ืืกืืื
ืืจืืืืื.
ยท QueueStream: ืืชืื ืืชืืจ ืืืืจืื
ยท StdoutStream: ืืืชื ื-stdout
ยท FancyStdoutStream: ืืืชื ืคืื ืฆืืขืื ื ืขื ืงืืืืืืช ืืื ื-stdout
stderr_stream.*
ืื ืืืคืฉืจืืืืช ืืื ื stderr_stream. ืืืจ ืืืฉืจ ืืืืชื ืืขืืืจ ืืช
ืื ืื ืืขืช ืืฆืืจืช ืืืคืข ืฉื ืืืืืงื ืืืืืืจืช ื
stderr_stream.class.
stdout_stream.class
ืฉื ืืืชืช Python ืืืกืื ืืืืืื ืฉืืืฆื ืืืงืื
ืื ืืื stdout ืืจื ืฉื ืื ืืชืืืืืื ืื __ืฉืึดืืึธื__() ืฉืึดืืึธื.
Circus ืืกืคืง ืืื ืฉืืขืืจื ืืจื ืฉืืื ืืชื ืืืื ืืืฉืชืืฉ ืืื ืงืืืืืช:
ยท ืืจื ืงืืืฅ: ืืืชื ืืงืืืฅ ืืืืื ืืืฆืข ืกืืืื ืืืื ืืืืืืื
ยท WatchedFileStream: ืืืชื ืืงืืืฅ ืืืกืชืื ืขื ืกืืืื ืืืื ืืืฆืื ื
ยท TimedRotatingFileStream: ืืืชื ืืงืืืฅ ืืืืื ืืกืืื ืืืื ืืกืืื
ืืจืืืืื.
ยท QueueStream: ืืชืื ืืชืืจ ืืืืจืื
ยท StdoutStream: ืืืชื ื-stdout
ยท FancyStdoutStream: ืืืชื ืคืื ืฆืืขืื ื ืขื ืงืืืืืืช ืืื ื-stdout
stdout_stream.*
ืื ืืืคืฉืจืืืืช ืืื ื stdout_stream. ืืืจ ืืืฉืจ ืืืืชื ืืขืืืจ ืืช
ืื ืื ืืขืช ืืฆืืจืช ืืืคืข ืฉื ืืืืืงื ืืืืืืจืช ื
stdout_stream.class.
close_child_stdout
ืื ืืืืืจ ื-True, ืืจื ื-stdout ืฉื ืื ืชืืืื ืืืฉืื ืื /dev/null
ืืืจื ืืืืื. ืืจืืจืช ืืืืื ื-False.
close_child_stderr
ืื ืืืืืจ ื-True, ืืจื stderr ืฉื ืื ืชืืืื ืืืฉืื ืื /dev/null
ืืืจื ืืืืื. ืืจืืจืช ืืืืื ื-False.
ืฉืื_ืืค
ืื ื ืืื, ืืขืื ืช ืชืืืื ืืืืฉ ืชืชืืฆืข ืขื ืืื ืฉืืืืช ืืืืช SIGHUP. ืืจืืจืืช ืืืื
ืืฉืงืจ.
ืืืช_ืขืฆืืจื
ืืืืช ืฉืืฉ ืืฉืืื ืืขืช ืขืฆืืจืช ืืชืืืื. ื ืืชื ืืฆืืื ืืืกืคืจ ืื ื
ืฉื ืืืืช. ืฉืืืช ืืืืชืืช ืืื ื ืชืืืื ืจืืฉืืืช ืืืืืืื ืืืืื 'SIG' ืื ืื. ืืื
ืืืืืืืช ืชืงืคืืช ืืืืืืช ืืืคืกืืง, INT, ืืืื ืืขื ื 3. ืืจืืจืช ืืืืื ืืื SIGTERM.
ืขืฆืืจ_ืืืืื
ืืขืช ืฉืืืืช ื ืืืช_ืขืฆืืจื, ืฉืื ืืืชื ืื ืืืืืื. ืืจืืจืช ืืืื ื
ืฉืงืจ.
max_retry
ืืกืคืจ ืืคืขืืื ืฉืื ื ืื ืกืื ืืืชืืื ืชืืืื, ืืคื ื ืฉืื ื ื ืืืฉืื ืืืคืกืืงืื
ืื ืืฆืืคื. ืืจืืจืช ืืืืื ืืื 5. ืืืืจ ื-1 ืืื ืืืฉืืืช ืืช max_retry ืืื ืกืืช ืฉืื
ืืื ืืืืืช ืืื.
ืคืกืง ืืื_ืืื ื ื
ืืกืคืจ ืืฉื ืืืช ืฉืืฉ ืืืืชืื ืขื ืฉืชืืืื ืืกืชืืื ืืื ืืคื ื ืื
ืืืจื ืืช ืื.
ืืืฉืจ ืขืืฆืจืื ืชืืืื, ืื ื ืงืืื ืื ืฉืืืืื ืื ื ืืืช_ืขืฆืืจื. ืขืืื ืขืืื ืืชืคืืก ืืช ืื
ืกืืื ืืืฆืข ืคืขืืืืช ื ืืงืื ืืคื ื ืืืฆืืื. ืื ืืขืืื ืืืื
ืคืขืื ืืืืจ ืฉื ืืืช Graceful_timeout, ืื ื ืฉืืืืื ืื ืืืช SIGKILL. ืื ืื
ืืคืฉืจ ืืชืคืืก ืืืชืืช SIGKILL ืื ืฉืืขืืื ืืคืกืืง.
ืืจืืจืช ืืืืื ืืื ืฉื ืืช ื-30.
ืขืืืคืืช
ืืกืคืจ ืฉืื ืฉืืืืืจ ืขืืืคืืช ืืฆืืคื. ืืฉืืืืจืจ ืืขืฉื ืงืฆืช
ืคืขืืืืช ืขื ืื ืืฆืืคืื, ืื ืืืืื ืืืชื ืขื ืืฉืื ืืื, ืืืืืื ืืืชืจ
ืืกืคืจ ืืงืื ืืืืชืจ. ืืจืืจืช ืืืืื ืืื 0.
ืงึฐืึธืฃ ืึผืึนืึตื
ืื ืืืืืจ ื-True, ืืฆืืคื ืืื ืืืื ืชืืืื ืืื ืืื ืืืืชืจ. ืืจืืจืช ืืืื ื
ืฉืงืจ.
use_sockets
ืื ืืืืืจ ื-True, ืืฆืืคื ืืื ืืืื ืืืฉืช ืืฉืงืขืื ืืืืืจืื ืืจื ืฉืืื
ืืชืืจื ืงืืฆืื. ืื False, ืื ื-Fds ืฉื ืืืืจืื ืกืืืจืื ืืืฉืจ ืชืืืื ืืฆืืฆื ืืชืืฆืข
ืึฐืคืึผืฆึธื. ืืจืืจืช ืืืืื ื-False.
max_age
ืื ืืืืืจ, ืืชืืืื ืืืคืขื ืืืืฉ ืืชืืฉืื ืืืืจ ืฉื ืืืช max_age. ืึถื
ืฉืืืืฉื ืืืฉืจ ืชืืืืืื ืขืืกืงืื ืืืืืจ ืฉื ืืืืจืื: ืืคืขืื ืืืืฉ ืฉื ืชืืืืืื
ืืฉืคืจ ืืช ืืืืื ืืขืืืก. ืืจืืจืช ืืืืื ืืื ืืืืืช ืืืฉืืช.
max_age_variance
ืื max_age ืืืืืจ, ืืชืืืื ืืชืงืืื ืืื max_age ืืืื max_age +
random(0, max_age_variance) ืฉื ืืืช. ืื ืืื ืข ืืคืขืื ืืืืฉ ืฉื ืื ืืชืืืืืื ืขืืืจ ื
ืฆืืคื ืืืช ืืืช. ืืจืืจืช ืืืืื ืืื 30 ืฉื ืืืช.
ืืคื ืืจืืฉื
ืื ืืืืืจ ื-True, ืืชืืืืืื ืืืคืขืื ืจืง ืืืืจ ืืืืืืจ ืืจืืฉืื ืื
ืืื ืืืฉืงืขืื ืืืืืืจืื (ืจืื ืืืื). ืื ืืฉ ืฆืืจื ืืืคืขืื ืืืืฉ, ืื ืืืื
ืืืคืขื ืจืง ืืืืจืืข ืืฉืงืข ืืื.
ืืืื.*
ืืืื ืืืื ืื: ืืคื ื_ืืชืื, after_start, before_spawn, after_spawn,
ืืคื ื_ืขืฆืืจ, after_stop, ืืคื ื_ืืืช, ืืืจื_ืืืช, ืกืืืืกืืืงืืช_ืืืจืืืืช
ืืืืจ ืคืื ืงืฆืืืช ืืชืงืฉืจืืช ืืืืจืืช ืืืชืืืจืืช ืืชืืืื ืืืคืขืื/ืืืืื ืฉื ืืฆืืคื.
ืื ืืงืจืก ืืืืจ ืื ื ืืื ืืื ืืื ืืื ืืื ื ืืคื ื_ืืชืื, before_spawn,
after_start or after_spawn, ืืืคืขืื ืชืืืื.
ืื ืืงืจืก ืืื ืืคื ื_ืืืช ืืืืืจ ืื ื ืืื, ืืื ืืืืช ืืืชืืื
ืื ืืืฉืื (ืืืขื SIGKILL ืฉื ืฉืื ืชืืื)
ืฉืืื ืื ืฉืืื ืฉื ืืฉื ืืืืื ืชืืืื ืืขืฆืืจื ืื ืืืื ืืืชื.
ื ืืชื ืืขืงืื ืืืจื ืืืืจืช ืืืชืงืฉืจืืช ืืืจื ืืื ืืืืืื ื ืืืคืจื ืืคืกืืง.
ืืืฉืจ ืืืื ืืืืืจ ื ื ึธืืึนื, ืชืชืขืื ืืื ืฉืืืื ืฉืชืชืจืืฉ ื-hook. ืื
ืืืืื ื ืฉืงืจ (ืืจืืจืช ืืืืื), ืืื ืืืืืจ ืื ื ืืื.
ืขืื ืขื ืืืื.
ืืืจืืืืื
ืืืฉืจ ืืกืืคืง, ืืฆืืืข ืขื ืืฉืืจืฉ ืฉื ืกืคืจืืืช Virtualenv. ืืฆืืคื ืืขืฉื ืืืช
ืืกืจืืง ืืช ืืืงืืื ืืืืืืช ืืชืจ ืืืืขื ืืช ืชืืื ื ืืืืฆืืข
ืกืืืื. ืืฉ ืืืฉืชืืฉ ืขื copy_env ืืืืืจ ื-True. ืืจืืจืช ืืืืื ืืื ืืื.
virtualenv_py_ver
ืืฆืืื ืืช ืืจืกืช ื-python ืฉื ื-virtualenv (ืืืฉื "3.3"). ืื ืฉืืืืฉื ืื
ืืคืขืืช ืงืจืงืก ืขื ืืจืกืช ืคืืชืื ืืืจืช (ืืืฉื "2.7") ืืฆืืคื ืืกืจืืง ืืช
ืืงืืื ืืืืืืช ืืชืจ ืฉื ืืจืกืช ืืคืืชืื ืฉืฆืืื ื ืืืขื ืืช ืืชืืื ืฉืื ืืชืื
ืกืืืืช ืืืืฆืืข. ืืฉ ืืืฉืชืืฉ ืขื ืืืจืืืืื. ืืจืืจืช ืืืืื ืืื ืืื.
respawn
ืื ืืืืืจ ื-false, ืืชืืืืืื ืืืืืคืืื ืขื ืืื ืฆืืคื ืื ืืืืืจื
ืืืืืืืืช. ื ืืชื ืืืคืขืื ืืืืฉ ืืช ืืชืืืืืื ืืืืคื ืืื ื ืขื ืืชืืื ืคืงืืื.
(ืืจืืจืช ืืืื: ื ืืื)
use_papa
ืืืืจ ื-true ืืื ืืืฉืชืืฉ ืืืื.
ืฉืงืข:NAME - as ืจื ืกืขืืคืื as ืืชื ืจืืฆื
ืืืืจื ืืืืจื ืฉื ืืฉืงืข. ืืจืืจืช ืืืืื ืืื 'ืืืจื ืืงืืื'
ื ืื ืื ืื. ืืจืืจืช ืืืืื ืืื 8080.
ืืฉืคืื ืืฉืคืืช ืืฉืงืขืื. ืืืื ืืืืืช 'AF_UNIX', 'AF_INET' ืื 'AF_INET6'. ืืจืืจืช ืืืื ื
'AF_INET'.
ืกืื ืกืื ืืฉืงืข. ืืืื ืืืืืช 'SOCK_STREAM', 'SOCK_DGRAM', 'SOCK_RAW', 'SOCK_RDM' ืื
'SOCK_SEQPACKET'. ืืจืืจืช ืืืืื ืืื 'SOCK_STREAM'.
ืืืฉืง
ืืืฉืจ ืืกืืคืง ืฉื ืืืฉืง ืจืฉืช ืืื 'eth0', ืืงืฉืจ ืืช ืืฉืงืข ืืื
ืืืฉืืจ ืืกืืื ืื ืฉืจืง ืื ืืช ืืชืงืืืืช ืืืืืฉืง ืืืกืืื ืืื
ืืขืืืืื ืขื ืืื ืืฉืงืข. ืื ืืืื ืืฉืืฉ ืืืฉื ืืื ืืืืืื ืืืื ืืืฉืืจ
ืืืื ืืขืช ืืจืืื ื-IN_ADDR_ANY (0.0.0.0) ืื IN_ADDR_BROADCAST
(255.255.255.255). ืฉืื ืื ืฉืื ืขืืื ืจืง ืขืืืจ ืกืืืื ืืกืืืืื ืฉื ืฉืงืขืื, ืืืืืื
ืฉืงืขื AF_INET.
ื ืชืื ืืืฉืจ ืืกืืคืง ื ืชืื ืืงืืืฅ ืฉืืฉืืฉ ืืงืืืฅ ืฉืงืข ืืื ืืงืก. ืื
ื ืชืื ืืกืืคืง, ืืฉืคืื ื ืืืฅ AF_UNIX ื ืืืืจื ื ื ืื ืืชืขืืืื.
ืืืืกืง ืืืฉืจ ืืกืืคืง, ืืืืืจ ืืช ื-umask ืฉืชืฉืืฉ ืืืฆืืจืช ืฉืงืข AF_UNIX. ื
ืืืืื, umask=000 ืืืฆืจ ืฉืงืข ืืืืฉืืจ 777.
ืืืืืืฃ
ืืขืช ืืฆืืจืช ืฉืงืขื ืืื ืืงืก ('AF_UNIX'), ืงืืืฅ ืงืืื ืขืฉืื ืืืฆืืืข ืขื ืืขืื
ืื ืืจืืจืช ืืืืื ืืื ืืืืืฉื. ืืคืจื ื ึธืืึนื ืคืฉืื ืืืกืืจ ืืช ืืงืืืฅ ืืืฉื ืื ืื
ืืืื ืฉืืฉืงืข ืื ืืื ืจืง ืขื ืืื ืงืจืงืก.
so_reuseport
ืื ืืืืืจ ื-True ื-SO_REUSEPORT ืืืื ืืคืืืคืืจืืช ืืืขื, ืืงืจืงืก ืืืื
ืฆืืจ ืืืื ืฉืงืข(ืื) SO_REUSEPORT ืืืฉืื ืขืืืจ ืื ืขืืื ืฉืืื ืืคืขืื ืฉืืื ื
ืืฉืชืืฉ ืืฉืงืข(ืื) ืื.
use_papa
ืืืืจ ื-true ืืื ืืืฉืชืืฉ ืืืื.
ืืจืืข ืฉื ืืฆืจ ืฉืงืข, ื ${circus.sockets.NAME} ื ืืชื ืืืฉืชืืฉ ืืืืจืืืช ืืคืงืืื
(cmd or ืืืขื) ืฉื ืฆืืคื. ืงืจืงืก ืืืืืฃ ืืืชื ืืขืจื FD. ืื ืืฆืืคื ืืืื
ืืฉ use_sockets ืืืืื ื ื ึธืืึนื ืืืจืช ืืฉืงืข ืืื ืกืืืจ ืืชืงืื
ืฉืืืืืช ืืืฉืจ ืืฆืืคื ืื ืกื ืืืฉืชืืฉ ืื.
ืืืืื:
[watcher:webworker]
cmd = chaussette --fd $(circus.sockets.webapp) chaussette.util.bench_app
use_sockets = ื ืืื
[socket:webapp]
ืืืจื = 127.0.0.1
ืืฆืืื = 8888
ืชืืกืฃ:NAME - as ืจื ืกืขืืคืื as ืืชื ืจืืฆื
ืืืฉืชืืฉ ืืฉื ืืืื ืืืฆืืืข ืขื ืืขืื ืืคืืืืื.
ืืืจ ืืืจ
ืื ืืคืชื ืืืจ ืฉื ืืฆื ืืงืืข ืืืขืืจ ืืืื ื ืืคืืืืื ื-
config ืืืคืื.
ืืชื ืืืื ืืืฉืชืืฉ ืืื ืืคืฉืจืืืืช ืืฆืืคื, ืืืืืื ืฉืชืืกืฃ ืืืคืขื ืืื ืฆืืคื.
Circus ืืืืข ืขื ืืื ืชืืกืคืื ืฉื ืฉืืื ืืจืืฉ ืืื ืืชื ืืืื ืื ืืืจืืื ืืืชื ืืงืืืช ืขื ืืื
ืืคืชื ืืฉืื.
env or env[:WATCHERS] - as ืจื ืกืขืืคืื as ืืชื ืจืืฆื
ืืืจ
ืฉื ืืฉืชื ื ืกืืืื ืืืงืฆืืช ืขืจื. ืกืืืื ืืกืื ืื bash
ืชืืืืคืื ื ืชืืืื. ืืืฉื, ืืฆืจืฃ / ืกื ื ื ืชืื 'ื ืชืื =
$PATH:/ ืกื'
ืืืืจ ืืืืจืื ืขื ืืกืคืงืช ืืฉืชื ื ืกืืืื ืืืคืขืืช ืชืืืืืื.
ืืืืื:
[watcher:worker1]
cmd = ping 127.0.0.1
[watcher:worker2]
cmd = ping 127.0.0.1
[env]
ืขืืื = ืฉืงืจ
ืืืฉืชื ื ืขืืื ืืืคืฅ ืืื ืืฆืืคืื ืืืืืืจืื ืืงืืืฅ ืืชืฆืืจื.
WATCHERS ืืืืื ืืืืืช ืจืฉืืื ืืืคืจืืช ืืคืกืืงืื ืฉื ืงืืขื ืฆืืคื ืืืืื ืกืืืื ืื.
ืื ืงืืขื Env ืืจืืืื ืชืืืืื ืืฆืืคื, ืื ืืฉืืืื ืืคื ืืกืืจ ืฉืื ืื ืืืคืืขืื
ืงืืืฅ ืืชืฆืืจื. ืขืจืืื ืืืืืจืื ืืืชืจ ืืงืืื ืขืืืคืืช.
ืืืืื:
[watcher:worker1]
cmd = ping 127.0.0.1
[watcher:worker2]
cmd = ping 127.0.0.1
[env:worker1,worker2]
ื ืชืื = / ืกื
[env:worker1]
PATH = $PATH
[env:worker2]
ืขืืื = ืฉืงืจ
worker1 ืืืคืขื ืขื PATH = $PATH (ืืืจืื ืืืกืืืื circusd ืืืคืขื)
worker2 ืืืคืขื ืขื PATH = / ืกื ืืขืืื = ืฉืงืจ
ืืคืฉืจ ืืืฉืชืืฉ ืื ืืชืืืื ืืืืืื.
ืืืืื:
[watcher:worker1]
cmd = ping 127.0.0.1
[watcher:worker2]
cmd = ping 127.0.0.1
[env:worker*]
ื ืชืื = / ืกื
ืฉื ืืื worker1 ื worker2 ืืืคืขื ืขื PATH = / ืกื
ืฉืืืืฉ ืกืืืื ืืฉืชื ืื
ืืขืช ืืชืืืช ืงืืืฅ ืืชืฆืืจื ืฉืื, ืืชื ืืืื ืืืฉืชืืฉ ืืืฉืชื ื ืกืืืื ืืืืืืจืื ื- env
ืืงืืข ืื ื os.environ ืขืฆืื.
ืืชื ืจืง ืฆืจืื ืืืฉืชืืฉ ื- circus.env. ืงืืืืืช.
ืืืืื:
[watcher:worker1]
cmd = $(circus.env.shell)
[watcher:worker2]
baz = $(circus.env.user)
bar = $(circus.env.yeah)
sup = $(circus.env.oh)
[socket:socket1]
port = $(circus.env.port)
[plugin:plugin1]
use = some.path
ืคืจืืืจ1 = $(circus.env.plugin_param)
[env]
ืื = ืืื
[env:worker2]
ืื = ืืกืืจ
ืื ืืฉืชื ื ืืืืืจ ืืืกืคืจ ืืงืืืืช, ืืขืจื ืืืืืื ืืืืชืจ ืืฉ ืขืืืคืืช: ื
ืืฉืชื ื ืืืืืืจ ื env:XXX ืืขืงืืฃ ืืฉืชื ื ืฉืืืืืจ ื env, ืืฉืจ ืืขืงืืฃ ืืช ื
ืืฉืชื ื ืืืืืืจ ื os.environ.
ื ืืชื ืืืฉืชืืฉ ืืืืืคืืช ืกืืืื ืืื ืืืง ืฉื ืืชืฆืืจื ืืื ืกืขืืฃ
ืืฉืชื ื
ืขืืฆืื ืื ืืื ืคืงืืืืช ื ืืืขืื ืื ืขื ืืื ืื ืืฉืชื ืื
ืืคื ืฉืืืื ืจืืืช, ืืคืฉืจ ืืืขืืืจ ืืืืข ืืกืืื ืฉืืืืฉื
ืืืืคื ืืื ืื ืืขืช ืืคืขืืช ืืชืืืืืื. ืืื ืืืชืจ ื ืืชื ืืงืื ืืช ืชืขืืืช ืืขืืื
(WID) ืืื ืืืคืฉืจืืืืช ืืืืขืืจืืช ื- ืืชึทืึฒืึดืื. ืื ืืกืฃ, ืืคืฉืจ
ืืืฉืช ืืืคืฉืจืืืืช ืฉืืืขืืจื ื- ืฆืืคื ืื ืฉืืฆืื ืืช ืืชืืืื.
ืืขืจื:
ืืืื ืืขืืื ืฉืื ื ืืืื ืืชืืืื. ืื ืขืจื ืืืืืื, ืืื ื-1,
ืฉืืื ืืืืืื ืจืง ืขืืืจ ืืฆืืคื.
ืืืืืื, ืื ืืชื ืจืืฆื ืืืฉืช ืืืฉืชื ืื ืืกืืืืื ืืืืืืื ืืกืืืื,
ืชืฆืืจื ืืขืฉืืช ืืช ืื ืขื ืืืืจื ืืื:
cmd = "ืชืืื ืื ืงืคื --sugar $(CIRCUS.ENV.SUGAR_AMOUNT)"
ืื ืขืืื ืขื ืฉื ืืื cmd ื ืืืขื.
ืึธืฉืืึผื:
ยท ืื ืืืฉืชื ืื ืืงืืืื ืงืืืืืช ืงืจืงืก.
ยท ืืชืืืืฃ ืืื ื ืชืืื ืจืืฉืืืช.
ืืจื ืชืฆืืจื
ืืืชืช ืืจื ืคืฉืืื ืืื QueueStream ื StdoutStream ืืื ืชืืื ืืช ืกืคืฆืืคืืืช ืืื
ืืืืงืช ืืจื ืืืจืช ืขืฉืืื ืืืืื ืืื:
ืืจื ืงืืืฅ
ืฉื ืืงืืืฅ
ื ืชืื ืืงืืืฅ ืฉืื ืืืืชื ืืืื.
ืคืืจืื ืืื
ืคืืจืื strftime ืฉืืฉืืฉ ืืงืืืืืช ืื ืคืขื ืขื ืืืชืืช ืืื. ืขื ืืื
ืืจืืจืช ืืืื ืื ืื ืืืื ืงืืืืืช.
ืืืืืจ: %Y-%m-%d %H:%M:%S
max_bytes
ืืืืื ืืืจืื ืฉื ืงืืืฅ ืืืืื ืืคื ื ืืคืขืืช ืงืืืฅ ืืืฉ. ืื ืื ืืกืืคืง, ื
ืืงืืืฅ ืื ืืชืืคื.
ืืืืื_ืกืคืืจืช
ืืกืคืจ ืงืืืฆื ืืืืื ืฉืืืฉืืจื ืืืจืืจืช ืืืื backup_count ืืื null.
ืืขืจื:
ืืืืืื ืืชืจืืฉ ืืื ืคืขื ืฉืงืืืฅ ืืืืื ืื ืืืื ืืืืจื ืฉื ืืืขื max_bytes. ืื
backup_count ืืื >= 1, ืืืขืจืืช ืชืืฆืืจ ืืจืฆืืคืืช ืงืืฆืื ืืืฉืื ืขื ืืืชื
ืฉื ืื ืชืื ืืงืืืฅ ืืืกืืก, ืื ืขื ืืกืืืืืช ".1", ".2" ืืื' ืืฆืืจืคืืช ืืืื. ื
ืืืืืื, ืขื backup_count ืฉื 5 ืืฉื ืงืืืฅ ืืกืืก ืฉื "app.log", ืชืงืื
"app.log", "app.log.1", "app.log.2", ... ืขื "app.log.5". ืืงืืืฅ ืื ืืชื
to ืืื ืชืืื "app.log" - ืืืฉืจ ืืื ืืชืืื, ืืื ื ืกืืจ ืืฉืื ืฉืื ื ื
"app.log.1", ืืื ืงืืืืื ืงืืฆืื "app.log.1", "app.log.2" ืืื', ืฉืื ืฉืื ื
ื-"app.log.2", "app.log.3" ืืื' ืืืชืืื.
ืืืืื:
[ืฆืืคื:ืืชืืื ืืช ืฉืื]
cmd = python -m myapp.server
stdout_stream.class = FileStream
stdout_stream.filename = test.log
stdout_stream.time_format = %Y-%m-%d %H:%M:%S
stdout_stream.max_bytes = 1073741824
stdout_stream.backup_count = 5
WatchedFileStream
ืฉื ืืงืืืฅ
ื ืชืื ืืงืืืฅ ืฉืื ืืืืชื ืืืื.
ืคืืจืื ืืื
ืคืืจืื strftime ืฉืืฉืืฉ ืืงืืืืืช ืื ืคืขื ืขื ืืืชืืช ืืื. ืขื ืืื
ืืจืืจืช ืืืื ืื ืื ืืืื ืงืืืืืช.
ืืืืืจ: %Y-%m-%d %H:%M:%S
ืืขืจื:
WatchedFileStream ืืกืชืื ืขื ืืื ืกืืืื ืืืื ืืืฆืื ื ืืื ืืืืืื ืงืืืฆื ืืืื
ืื ืชืืคืื ืืืืื ืืื. ืงืืืฅ ืืคืื ืืืื ืืืขืงื ืืื ืืื ืืืืืง ืื ืคืขื ืื
ืืืขืืจ ืขื ืืื ืืื ืกืืืื ืืืืื ืืืืฆืื ื, ืืื ืืืืืื ืฉื ืงืืืฅ ืืคืื ืชืืื
ื ืืขื ืืืืฉ ืืืืืืืืช.
ืืืืื:
[ืฆืืคื:ืืชืืื ืืช ืฉืื]
cmd = python -m myapp.server
stdout_stream.class = WatchedFileStream
stdout_stream.filename = test.log
stdout_stream.time_format = %Y-%m-%d %H:%M:%S
TimedRotatingFileStream
ืฉื ืืงืืืฅ
ื ืชืื ืืงืืืฅ ืฉืื ืืืืชื ืืืื.
ืืืืื_ืกืคืืจืช
ืืกืคืจ ืงืืืฆื ืืืืื ืฉืืืฉืืจื ืืืจืืจืช ืืืื backup_count ืืื null.
ืคืืจืื ืืื
ืคืืจืื strftime ืฉืืฉืืฉ ืืงืืืืืช ืื ืคืขื ืขื ืืืชืืช ืืื. ืขื ืืื
ืืจืืจืช ืืืื ืื ืื ืืืื ืงืืืืืช.
ืืืืืจ: %Y-%m-%d %H:%M:%S
ืกืืื_ืืชื
ืกืื ืืืจืืื. ืจืฉืืืช ืืขืจืืื ืืืคืฉืจืืื ื ืืฆืืช ืืืื. ืฉืืื ืื ืฉืื ืื
ืื ืจืืืฉ ืืืืชืืืช ืืืืืืช.
โโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ
โืขืจื โ ืกืื ืืืจืืื โ
โโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโ
โ'S' โ ืฉื ืืืช โ
โโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโ
โ'M' โ ืืงืืช โ
โโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโ
โ'H' โ ืฉืขืืช โ
โโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโ
โ'D' โ ืืืื โ
โโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโ
โ'W0'-'W6' โ ืืื ืืื (0=ืืื ืฉื ื) โ
โโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโ
โ'ืืฆืืช' โ ืืชืืคืื ืืืฆืืช โ
โโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโ
rotate_interval
ืืจืืื ืืืชืืคืืืช.
ืืขืจื:
TimedRotatingFileStream ืืกืืื ืงืืืฆื ืืืื ืืืจืืืื ืืื ืืกืืืืื. ืืจืืื ืืืืื
ื ืงืืข ืขื ืืื ืฉืืืื ืฉื rotate_when ื-rotate_interval.
ืืืืื:
[ืฆืืคื:ืืชืืื ืืช ืฉืื]
cmd = python -m myapp.server
stdout_stream.class = TimedRotatingFileStream
stdout_stream.filename = test.log
stdout_stream.time_format = %Y-%m-%d %H:%M:%S
stdout_stream.utc = ื ืืื
stdout_stream.rotate_when = H
stdout_stream.rotate_interval = 1
FancyStdoutStream
ืฆึถืึทืข
ืืฉืืืื ืฉื of an ASCII ืฆึถืึทืข:
ยท ืืืื
ยท ืืจืืง
ยท ืฆืืื
ยท ืืืื
ยท ืืื ืื
ยท ืืืจืงืื
ยท ืืื
ืคืืจืื ืืื
ืคืืจืื strftime ืฉืืื ืฉืืจื ืชืืื ืงืืืืืช.
ืืจืืจืช ืืืืื ืืื: %Y-%m-%d %H:%M:%S
ืืืืื:
[ืฆืืคื:ืืชืืื ืืช ืฉืื]
cmd = python -m myapp.server
stdout_stream.class = FancyStdoutStream
stdout_stream.color = ืืจืืง
stdout_stream.time_format = %Y/%m/%d | %H:%M:%S
ืคืงืืืืช
ืืืืงื ืืงืจืงืก ืืชืืืจืจืืช ืืขืจืืืช ืืคืืงืื. circusctl ืืื ืจืง ืืงืื zeromq,
ืืื ืฆืจืื ืืชื ืืืื ืื ืืื ืืืืคื ืชืืื ืชื ืืืขืจืืช Circus ืขื ืืื ืืชืืืช zmq ืืฉืื
ืืงืืืืช.
ืื ืืืืืขืืช ืื ืืืคืื JSON.
ืขืืืจ ืื ืคืงืืื ืืืื, ืื ื ืืกืคืงืื ืืืืื ืืฉืืืืฉ ืขื circusctl ืื ืื ืืช ืืงืื /
ืคืื ืืืืขืืช zmq.
circus-ctl ืคืงืืืืช
ยท ืืืืกืืฃ: ืคืงืืืืช/ืืืกืฃ
ยท decr: ืคืงืืืืช/ืืกืจื
ยท dstats: ืคืงืืืืช/dstats
ยท ืืงืื: ืคืงืืืืช/ืงืื
ยท ืืืคืฆืืืช ืืืืืืืืช: ืคืงืืืืช/ืืืืืืืืคืฆืืืช
ยท ืชืืกืคืช: ืคืงืืืืช/incr
ยท ืคึผึดืืชืึนื: ืคืงืืืืช/ืืืคืืืื
ยท ืจืฉืืื: ืคืงืืืืช/ืจืฉืืื
ยท ืืืงืฉืื: ืคืงืืืืช/ืืืื ื
ยท ืฉืงืขื ืจืฉืืืืช: ืคืงืืืืช/ืืืกืืื
ยท ืืกืคืจ ืชืืืืืื: ืคืงืืืืช/ืืกืคืจ ืชืืืืืื
ยท ืฉืืืจื ืืกืคืจ: ืคืงืืืืช / numwatchers
ยท ืืคืฉืจืืืืช: ืคืงืืืืช/ืืคืฉืจืืืืช
ยท ืืืคืกืืง: ืคืงืืืืช/ืฆื
ยท ืืืขืื ืืืืฉ: ืคืงืืืืช/ืืขืื ื ืืืืฉ
ยท ืืขื ืืืืฉ ืืช ืืชืฆืืจื: commands/reloadconfig
ยท ืืคืขืื ืืืืฉ: ืคืงืืืืช/ืืคืขืื ืืืืฉ
ยท rm: ืคืงืืืืช/rm
ยท ืกื: ืคืงืืืืช/ืกื
ยท ืืึนืช: ืคืงืืืืช/ืืืช
ยท ืืชืืื: ืคืงืืืืช/ืืชืื
ยท ืกืืืืกืืืงืืช: ืคืงืืืืช/ืกืืืืกืืืงืืช
ยท ืืฆื: ืคืงืืืืช/ืกืืืืก
ยท ืืืคืกืืง: ืคืงืืืืช/ืขืฆืืจื
ืืืืกืืฃ a ืฆืึนืคึถื
ืคืงืืื ืื ืืืกืืคื ืฆืืคื ืืืืคื ืืื ืื ืืืืจืจ.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืืืกืฃ",
"ื ืืกืื": {
"cmd": "/path/to/commandline --option"
"name": "nameofwatcher"
"args": [],
"ืืคืฉืจืืืืช": {},
"ืืชืื": ืฉืงืจ
}
}
ืืืืขื ืืืืื 2 ืืืคืืื ืื:
ยท cmd: ืฉืืจืช ืคืงืืื ืืืื ืืืืฆืืข ืืชืืืื
ยท args: ืืขืจื, ืืจืืืื ืืื ืฉืืืขืืจื ืืคืงืืื (ืืืคืฆืืื ืื)
ยท ืฉื: ืฉื ืืฆืืคื
ยท ืืคืฉืจืืืืช: ืืคืฉืจืืืืช ืฉื ืฆืืคื
ยท ืืชืื: ืืคืขื ืืช ืืฆืืคื ืืืืจ ืืืฆืืจื
ืืชืืืื ืืืืืจื ืกืืืืก "ืืกืืจ".
ืคืืงืื ืงื
$ circusctl ืืืกืฃ [--ืืชืื]
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื ืฉืืฉ ืืืฆืืจ
ยท : ืฉืืจืช ืคืงืืื ืืืื ืืืืฆืืข ืืชืืืื
ยท --ืืชืื: ืืคืขื ืืช ืืฆืืคื ืืื
ืืฆืืจื ืื ืืื ืืกืคืจ of ืชืืืืืื in a ืฆืึนืคึถื
ืืขืจื ืื ืืืจืืื ืืช ืืกืคืจ ืืชืืืืืื ืืฆืืคื ื- , 1 ืืื ื
ืืจืืจืช ืืืืื.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "decr",
"ื ืืกืื": {
"ืฉื": " "
"ื "ื:
"ืืืื": ืื ื ืืื
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืคืจ ืืชืืืืืื ืืืืคืืื 'numprocesses':
{ "status": "ืืกืืจ", "numprocesses": , "ืืื", "ืืืชืืช ืืื" }
ืคืืงืื ืงื
$ circusctl decr [ ] [--ืืืื]
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื
ยท : ืืกืคืจ ืืชืืืืืื ืืืกืจื.
ืืงืื ืงืจืงืก ืกืืืืกืืืงืืช
ืืชื ืืืื ืืงืื ืืื ืขืช ืืื ืกืืืืกืืืงืืช ืขื circusd ืขื ืืคืงืืื dstat.
ZMQ ืืขืจืืช ื ืืกืคืืช
ืืื ืืงืื ืืช ืื ืชืื ืื ืืกืืืืกืืืื ืฉื ืืงืจืงืก, ืคืฉืื ืืจืฅ:
{
"command": "dstats"
}
ืืชืืืื ืืืืืจื ืืืคืื ืฉื ืืืืคืืื "ืืืืข" ืืืืื ืืื ืืืืข ืขื ืชืืืื:
{
"ืืืืข": {
"ืืืืื": [],
"cmdline": "ืคืืชืื",
"ืืขืื": 0.1,
"ctime": "0:00.41",
"ืื": 0.1,
"mem_info1": "3 ืืืืืื",
"mem_info2": "2G",
"ื ืืื": 0,
"pid": 47864,
"ืฉื ืืฉืชืืฉ": "ืฉืืจืฉ"
},
"status": "ืืกืืจ",
"ืืื": 1332265655.897085
}
ืคืืงืื ืงื
$ circusctl dstats
ืืงืื ืื ืืื ืขืจื of ืกืคืฆืืคื ืฆืึนืคึถื ืืคืฉืจืืืืช
ื ืืชื ืืืฉืชืืฉ ืืคืงืืื ืื ืืื ืืฉืืื ืืช ืืขืจื ืื ืืืื ืฉื ืืคืฉืจืืช ืฆืืคื ืืืช ืื ืืืชืจ.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืงืื",
"ื ืืกืื": {
"keys": ["key1, "key2"]
"name": "nameofwatcher"
}
}
ืืืืขืช ืืงืฉื ืืืืื ืฉื ื ืืืคืืื ืื:
ยท ืืงืฉืื: ืจืฉืืื, ืืงืฉื ืืืคืฉืจืืช ืฉืขืืืจื ืืจืฆืื ื ืืงืื ืืช ืืขืจืืื
ยท ืฉื: ืฉื ืืฆืืคื
ืืืืืืืงื ืืชืืืื ืืฉ ืืืคืืื ืืคืฉืจืืืืช ืฉืืื ืืืืื ืฉื ืฉืืืช ืืคืฉืจืืืืช ื
ืขืจืืื.
ืืืืืื:
{
"status": "ืืกืืจ",
"ืืคืฉืจืืืืช": {
"timeout_graceful": 300,
"send_hup": ื ืืื,
},
ืืื': 1332202594.754644
}
ืคืืงืื ืงื
$ circusctl ืืงืื
ืืงืื ืื ืืื ืคืืกืง ืืคืฉืจืืืืช
ืคืงืืื ืื ืืืืืจื ืืช ืืคืฉืจืืืืช ืืืืจืจ
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืืืืืืืืคืฆืืืช",
"ื ืืกืื": {
"key1": "val1",
..
}
}
ืืืืขื ืืืืื 2 ืืืคืืื ืื:
ยท ืืงืฉืื: ืจืฉืืื, ืืงืฉื ืืืคืฉืจืืช ืฉืขืืืจื ืืจืฆืื ื ืืงืื ืืช ืืขืจืืื
ืืชืืืื ืืืืืจื ืืืืืืงื ืขื ืืืคืืื "ืืคืฉืจืืืืช" ืืืืื ืืช ืจืฉืืืช ืืืคืชื/ืขืจื
ืืืืืจ ืขื ืืื ืงืจืงืก.
ืืืืืื:
{
"status": "ืืกืืจ",
"ืืคืฉืจืืืืช": {
"check_delay": 1,
...
},
ืืื': 1332202594.754644
}
ืคืืงืื ืงื
$ circusctl ืืืคืฆืืืช ืืืืืืืืช
ืืคืฉืจืืืืช
ืืงืฉื ืืืคืฉืจืืืืช ืื:
ยท ื ืงืืืช ืงืฆื: ื ืงืืืช ืืงืฆื ืฉื ืืืงืจ ZMQ
ยท pubsub_endpoint: ื ืงืืืช ืืงืฆื ืฉื pubsub
ยท check_delay: ืืืฉืืื ืืื ืฉืชื ื ืงืืืืช ืืงืจ
ยท multicast_endpoint: ื ืงืืืช ืืงืฆื ืฉื multicast ืืืืืื ืืืืืืื ืฉื ืืฉืืื circusd
ืชืึนืกึถืคึถืช ืื ืืื ืืกืคืจ of ืชืืืืืื in a ืฆืึนืคึถื
ืืขืจื ืื ืืืืืื ืืช ืืกืคืจ ืืชืืืืืื ืืฆืืคื ื- , 1 ืืื ื
ืืจืืจืช ืืืื
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "incr",
"ื ืืกืื": {
"ืฉื": " ",
"ื "ื: ,
"ืืืื": ืื ื ืืื
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืคืจ ืืชืืืืืื ืืืืคืืื 'numprocesses':
{ "status": "ืืกืืจ", "numprocesses": , "ืืื", "ืืืชืืช ืืื" }
ืคืืงืื ืงื
$ circusctl Incr [ ] [--ืืืื]
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื.
ยท : ืืกืคืจ ืืชืืืืืื ืฉืืฉ ืืืืกืืฃ.
ืฆืืจ ืคึผึธืึธื ืื ืชืื ืงืจืงืก ืชืืืื
ืคืงืืื ืื ืฉืืืืฉืืช ืจืง ืื ืืืชืงื ืช ืืืืืช ipython.
ืคืืงืื ืงื
$ circusctl ipython
ืืงืื ืจืฉืืื of ืฆืืคืื or ืชืืืืืื in a ืฆืึนืคึถื
ZMQ ืืขืจืืช ื ืืกืคืืช
ืืื ืืงืื ืืช ืจืฉืืืช ืื ืืฆืืคืื:
{
"command": "ืจืฉืืื",
}
ืืื ืืงืื ืืช ืจืฉืืืช ืืชืืืืืื ืืคืขืืืื ื-watcher:
{
"command": "ืจืฉืืื",
"ื ืืกืื": {
"name": "nameofwatcher",
}
}
ืืชืืืื ืืืืืจื ืืช ืืจืฉืืื ืืืงืฉื. ืืืืคืื ืืืืืืจ ืืืื ืืืืืช 'ืฆืืคืื' ืื
'pids' ืืืชืื ืืืงืฉื.
ืคืืงืื ืงื
$ circusctl ืจืฉืืื [ ]
ืืืจืฉื ื a ืฆืึนืคึถื ืืืจืืข
ZMQ
ืืื ืจืืข ื ืืชื ืืืืจืฉื ืืืืจืืข ืงืจืงืก. ืงืจืงืก ืืกืคืง ืขืืืื PUB/SUB ืขืืื
ืื ืืงืื ืืืื ืืืืจืฉื. URI ืฉื ื ืงืืืช ืืงืฆื ืฉื ืืื ืื ื ืงืืข ื-circus.ini
ืงืืืฅ ืชืฆืืจื.
ืืืจืืขืื ืื ื ืืฉืื ืคืื:
ยท ืฆืึนืคึถื. .ืึดืงืฆืึนืจ: ืืืฉืจ ืชืืืื ืงืืฆืจ
ยท ืฆืึนืคึถื. .ืึฐืึทืฉืึฐืจึดืืฅ: ืืืฉืจ ื ืืฆืจ ืชืืืื
ยท ืฆืึนืคึถื. .ืึทืึฒืจืึนื: ืืืฉืจ ืชืืืื ืืืืช
ยท ืฆืึนืคึถื. .ืึฐืขืึผืืึผึธื: ืืืฉืจ ืชืฆืืจืช ืืฆืืคื ืืชืขืืื ืช
ยท ืฆืึนืคึถื. .ืชืคืกืืง: ืืืฉืจ ืฆืืคื ืืืคืกืง
ยท ืฆืึนืคึถื. .ืึทืชืึธืึธื: ืืืฉืจ ืืืคืขื ืฆืืคื
ืื ืืืืขืืช ืืืืจืืขืื ื ืืฆืืืช ืืืื ื json.
ืคืืงืื ืงื
ืืืงืื ืขืืืื ืืื ืืกืคืง ืืจื ืคืฉืืื ืืืืืื ืืืืจืืขืื:
ืชืงืฉืื ืืืขืื [ ,...]
ืืืืื of ืืชืืฆืื
$ circusctl ืืืืืื tcp://127.0.0.1:5556
watcher.refuge.spawn: {u'process_id': 6, u'process_pid': 72976,
u'time': 1331681080.985104}
watcher.refuge.spawn: {u'process_id': 7, u'process_pid': 72995,
u'time': 1331681086.208542}
watcher.refuge.spawn: {u'process_id': 8, u'process_pid': 73014,
u'time': 1331681091.427005}
ืืงืื ืื ืืื ืจืฉืืื of ืืจืืืืช
ZMQ ืืขืจืืช ื ืืกืคืืช
ืืื ืืงืื ืืช ืจืฉืืืช ืืฉืงืขืื:
{
"command": "listsockets",
}
ืืชืืืื ืืืืืจื ืจืฉืืื ืฉื ืืืคืืื json ืขื ืืคืชืืืช ืขืืืจ fd, name, host ื-port.
ืคืืงืื ืงื
$ circusctl listsockets
ืืงืื ืื ืืื ืืกืคืจ of ืชืืืืืื
ืงืื ืืช ืืกืคืจ ืืชืืืืืื ืืฆืืคื ืื ืืืืจืจ
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "numprocesses",
"ื ืืกืื": {
"ืฉื": " "
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืคืจ ืืชืืืืืื ืืืืคืืื 'numprocesses':
{ "status": "ืืกืืจ", "numprocesses": , "ืืื", "ืืืชืืช ืืื" }
ืื ืฉื ืืืืคืืื ืื ืฆืืื, ืกืืื ืื ืืชืืืืืื ืืื ืืืืื ืืืืืจ.
ืคืืงืื ืงื
$ circusctl numprocesses [ ]
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื
ืืงืื ืื ืืื ืืกืคืจ of ืฆืืคืื
ืงืื ืืช ืืกืคืจ ืืฆืืคืื ืืืืจืจ
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "numwatchers",
}
ืืชืืืื ืืืืืจื ืืช ืืกืคืจ ืืฆืืคืื ืืืืคืืื 'numwatchers':
{ "status": "ืืกืืจ", "numwatchers": , "ืืื", "ืืืชืืช ืืื" }
ืคืืงืื ืงื
$ circusctl numwatchers
ืืงืื ืื ืืื ืขืจื of ืืช ืื ืืคืฉืจืืืืช ื a ืฆืึนืคึถื
ืคืงืืื ืื ืืืืืจื ืืช ืื ืขืจืื ืืืคืฉืจืืืืช ืขืืืจ ืฆืืคื ื ืชืื.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืืคืฉืจืืืืช",
"ื ืืกืื": {
"name": "nameofwatcher",
}
}
ืืืืขื ืืืืื ืืืคืืื ืืื:
ยท ืฉื: ืฉื ืืฆืืคื
ืืืืืืืงื ืืชืืืื ืืฉ ืืืคืืื ืืคืฉืจืืืืช ืฉืืื ืืืืื ืฉื ืฉืืืช ืืคืฉืจืืืืช ื
ืขืจืืื.
ืืืืืื:
{
"status": "ืืกืืจ",
"ืืคืฉืจืืืืช": {
"timeout_graceful": 300,
"send_hup": ื ืืื,
...
},
ืืื': 1332202594.754644
}
ืคืืงืื ืงื
$ circusctl ืืคืฉืจืืืืช
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื
ืืงืฉื ืืืคืฉืจืืืืช ืื:
ยท ืืกืคืจ ืชืืืืืื: ืืกืคืจ ืฉืื, ืืกืคืจ ืชืืืืืื
ยท warmup_delay: ืืกืคืจ ืฉืื ืื ืืกืคืจ, ืขืืืื ืืืืชื ื ืืื ืืฉืจืฆืช ืชืืืื ืืฉื ืืืช
ยท working_dir: ืืืจืืืช, ืกืคืจืืื ืฉืื ืืชืืฆืข ืืชืืืื
ยท uid: ืืืจืืืช ืื ืืกืคืจ ืฉืื, ืืืื ืืฉืชืืฉ ืืืฉืืฉ ืืืคืขืืช ืืชืืืื
ยท gid: ืืืจืืืช ืื ืืกืคืจ ืฉืื, ืืืื ืงืืืฆื ืืืฉืืฉ ืืืคืขืืช ืืชืืืื
ยท send_hup: ืืืืืื ื, ืื TRU ืืืืช HUP ืืฉืืฉ ืืืขืื ื ืืืืฉ
ยท shell: boolean, ืืคืขืื ืืช ืืคืงืืื ืืกืืืืช ืืขืืคืช ืื ืืื ื ืืื ื
ยท cmd: string, ืฉืืจืช ืืคืงืืื ืืืฉืืฉืช ืืืคืขืืช ืืชืืืื
ยท env: ืืืืืืงื, ืืืืจ ืืช ืืกืืืื ืฉืื ืืชืืืื ืืืฉืง
ยท retry_in: ืืกืคืจ ืฉืื ืื ืืกืคืจ, ืืื ืืฉื ืืืช ืฉืื ื ืืืืื ืืคื ื ืฉื ื ืกื ืฉืื ืืืคืขืื ืืช
ืชืืืื ืื ืืืฉื ืืกืคืจ ืื ืืกืืื ืืช ืืืจืื.
ยท max_retry: ืืกืคืจ ืฉืื, ืืืงืกืืืื ืฉื ืืืืืืช ื ืืกืืื ืืช ืืืืจืื
ยท ืคืกืง ืืื_graceful: ืืกืคืจ ืฉืื ืื ืืกืคืจ, ืืื ืฉืื ื ืืืืื ืืคื ื ืฉืืืืืื ื ืืจืื ืชืืืื.
ยท ืขืืืคืืช: ืืฉืืฉ ืืืืื ืฆืืคืื ืืืืจืจ
ยท ืืืื: ืื ื ืืื, ืฆืืคื ืืืื.
ยท max_age: ืืื ืฉืื ืชืืืื ืืืื ืืืืืช ืืคื ื ืฉืืื ืืืคืขื ืืืืฉ
ยท max_age_variance: ืืฉืชื ื ืืื ื ืืกืฃ ืืืืืช, ื ืื ืข ืืืืช ืขืืจ.
ืืืคืกืืง ืื ืืื ืคืืกืง ืืื
ืืืฉืจ ืืืืจืจ ืืงืื ืคืงืืื ืื, ืืืืจืจ ืืืฆื.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืฆื",
"ืืืื": ืื ื ืืื
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืืกืืจ".
If ืืืชื ื ืืื False (ืืจืืจืช ืืืื), ืืฉืืื ืชืืืืจ ืืื ืืืืจ ืืฉืืื ืืืช_ืขืฆืืจื
ืขื ืื ืชืืืื.
If ืืืชื ื ื ืืื, ืืฉืืื ืชืืืืจ ืจืง ืืืฉืจ ืชืืืื ืืขืฆืืจื ืืกืชืืื ืืืืืืื.
ืืืื ืืืคืฉืจืืช graceful_timeout, ืื ืืืื ืืงืืช ืงืฆืช ืืื.
ืคืืงืื ืงื
$ circusctl ืขืืื [--ืืืชืื]
ืึดืืขืึนื ืึดืึธืึธืฉื ืื ืืื ืคืืกืง or a ืฆืึนืคึถื
ืคืงืืื ืื ืืืขื ืช ืืืืฉ ืืช ืื ืืชืืืื ืืฆืืคื ืื ืืช ืื ืืฆืืคืื. ืื ืืงืจื ืืืื
ืืชืื 3 ืืจืืื:
ยท ืื ืืื ื ื ืืื ืฉืงืจ, ืืชืจืืฉืช ืืคืขืื ืืืืฉ ืคืฉืืื.
ยท ืื ืฉืื_ืืค ื ืืื ืขืืืจ ืืฆืืคื, ืืืช HUP ื ืฉืื ืืื ืชืืืื.
ยท
ืืืจืช:
ยท ืื ืืจืฆืฃ ืืื ืฉืงืจ, ืืืืจืจ ืื ืกื ืืืฉืจืืฅ ืืกืคืจ ืชืืืืืื ืืืฉ
ืชืืืืืื. ืื ืืชืืืืืื ืืืืฉืื ื ืืฆืจื ืืืฆืืื, ืืชืืฆืื ืืื ืืืช
ืื ืืชืืืืืื ืืืฉื ืื ื ืขืฆืจืื, ืฉืื ืืืจืืจืช ืืืื ืืชืืืืืื ืืืฉื ืื ืืืืชืจ ืื
ืืืคืกืง ืืืฉืจ ืืกืคืจ ืืชืืืืืื ืืคืืขื ืขืืืจ ืฆืืคื ืืืื ื
ืืกืคืจ ืชืืืืืื.
ยท ืื ืจืฆืฃ ื ืืื, ืืืืจืจ ืืชืืื ืืืืฉ ืื ืชืืืื ืืจืฆืฃ
ืืจื (ืขื ื ืขืืืื_ืืืืื ืืคืกืงื ืืื ืื ืฉืื)
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืืขื ืืืืฉ",
"ื ืืกืื": {
"ืฉื":' ",
"ืื": ื ืืื,
"sequential": false,
"ืืืื": ืื ื ืืื
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืืกืืจ". ืื ืื ืืก ืืื ื ื ืืืืืจ ืืืืช ืืชืืืืืื
ืืืฆื ืืื.
ืื ืฉื ืื ืืก ืงืืื, ืืืขืื ื ืืืืฉ ืชืืื ืขื ืืฆืืคื.
ืคืืงืื ืงื
ืืขื ืืืืฉ $ circusctl [ ] [--ืืืคืกืืง] [--ืืืชืื]
[--ืกึดืืจึธืชึดื]
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื
ยท --ืืืื, ืืกืืื; ืฆื ืืืฆืืืช ืืื
ืึดืืขืึนื ืึดืึธืึธืฉื ืื ืืื ืชืฆืืจื ืคืืื
ืคืงืืื ืื ืืืขื ืช ืืืืฉ ืืช ืงืืืฅ ืืชืฆืืจื, ืื ืฉืฉืื ืืืื ืืงืืืฅ ืืชืฆืืจื ืืืื
ืืฉืชืงืฃ ืืชืฆืืจืช ืืงืจืงืก.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "reloadconfig",
"ืืืื": ืื ื ืืื
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืืกืืจ". ืื ืื ืืก ืืื ื ื ืืืืืจ ืืืืช ืืชืืืืืื
ืืืฆื ืืื.
ืคืืงืื ืงื
$ circusctl reloadconfig [--ืืืชืื]
ืืคืขื ืืืืฉ ืื ืืื ืคืืกืง or a ืฆืึนืคึถื
ืคืงืืื ืื ืืคืขื ืืืืฉ ืืช ืื ืืชืืืื ืืฆืืคื ืื ืืช ืื ืืฆืืคืื. ืืคืื ืงืฆืื ืืื ืคืฉืื
ืขืฆืืจ ืฆืืคื ืืื ืืคืขื ืืืชื ืืืืฉ.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืืคืขื ืืืืฉ",
"ื ืืกืื": {
"ืฉื": " ",
"ืืืชืื": ืฉืงืจ,
"match": "[ืคืฉืื|ืืืื|ืจืืงืก]"
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืืกืืจ".
ืื ืฉื ืื ืืก ืงืืื, ืืืขืื ื ืืืืฉ ืชืืื ืขื ืืฆืืคื.
If ืืืชื ื ืืื False (ืืจืืจืช ืืืื), ืืฉืืื ืชืืืืจ ืืื ืืืืจ ืืฉืืื ืืืช_ืขืฆืืจื
ืขื ืื ืชืืืื.
If ืืืชื ื ื ืืื, ืืฉืืื ืชืืืืจ ืจืง ืืืฉืจ ืชืืืื ืืืคืขืื ืืืืฉ ืืืื ืืื
ืืกืชืืื. ืืืื ืืืคืฉืจืืช graceful_timeout, ืื ืืืื ืืงืืช ืงืฆืช ืืื.
ืืฉืืืื ืืืชืืื ืคืจืืืจ ืืืื ืืงืื ืืช ืืขืจื ืคืฉืื ืืืฉืืืืช ืืืจืืืช, ืืืฉ ืขืืืจ ืชื ืืืื
ืืชืืื (ืืจืืจืช ืืืื) ืื regex ืขืืืจ ืืชืืืช ืืืืืืื ืจืืืืื.
ืคืืงืื ืงื
$ circusctl ืืคืขื ืืืืฉ [ืฉื] [--waiting] [--match=simple|glob|regex]
ืืคืฉืจืืืืช
ยท : ืฉื ืื ืชืื ืืช ืฉื ืืฆืืคื/ืื
ยท : ืฉืืืช ืืชืืื ืฉื ืฆืืคื
ืืืกืืจ a ืฆืึนืคึถื
ืคืงืืื ืื ืืกืืจื ืฆืืคื ืืืืคื ืืื ืื ืืืืืจืจ. ืืฆืืคืื ืื ืืื
ืืืคืกืง ืืืจืืจืช ืืืื.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "rm",
"ื ืืกืื": {
"ืฉื": " ",
"nostop": ืฉืงืจ,
"ืืืื": ืื ื ืืื
}
}
ืืชืืืื ืืืืืจื ืกืืืืก "ืืกืืจ".
If ืืื ืขืฆืืจื ื ืืื (ืืจืืจืช ืืืื: False), ืืชืืืืืื ืขืืืจ ืืฆืืคื ืื ืืืคืกืงื -
ืืืงืื ืืืช, ืืฆืืคื ืคืฉืื ืืืฉืื ืขื ืืื ืืงืจืงืก ืืชืืืืื ืืฆืืคื ืืืื
ืืืจืืื ืืขืฆืืจ ืืช ืขืฆืื. ืื ืืื ืขืฆืืจื ืื ืฆืืื ืื ืฉืืื False, ืื ื-
ืชืืืืื ืืฆืืคื ืืืคืกืงื ืืื.
If ืืืชื ื ืืื False (ืืจืืจืช ืืืื), ืืฉืืื ืชืืืืจ ืืื ืืืืจ ืชืืืืช ืืืกืจื
ืืืขืฆืืจ ืืช ืืฆืืคื ืืืงืืื.
If ืืืชื ื ื ืืื, ืืฉืืื ืชืืืืจ ืจืง ืืืืจ ืชืืืื ืืืกืจื ืืืขืฆืืจื
ืืกืชืืื ืืืืืืื. ืืืื ืืืคืฉืจืืช graceful_timeout, ืื ืืืื ืืงืืช ืงืฆืช ืืื.
ืคืืงืื ืงื
$ circusctl rm [--ืืืื] [--nostop]
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื ืฉืืฉ ืืืกืืจ
ยท nostop: ืื ืชืคืกืืง ืืช ืชืืืืื ืืฆืืคื, ืคืฉืื ืืกืจ ืืช ืืฆืืคื
ืืงืืืข a ืฆืึนืคึถื ืืึนืคึผึฐืฆึดืึธื
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืงืืข",
"ื ืืกืื": {
"name": "nameofwatcher",
"ืืคืฉืจืืืืช": {
"key1": "val1",
..
}
"ืืืื": ืื ื ืืื
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืืกืืจ". ืขืืื ืืคืงืืื 'ืืคืฉืจืืืืช' ืขืืืจ ืจืฉืืื ืฉื ืืคืชืืืช ืืืืืจื.
ืคืืงืื ืงื
$ circusctl ืกื --ืึทืืชึธื ึธื
ืฉืืืื a ืืึนืช
ืคืงืืื ืื ืืืคืฉืจืช ืืฉืืื ืืืช ืืื ืืชืืืืืื ืืฆืืคื, ืชืืืื ืกืคืฆืืคื
ืืฆืืคื ืื ืืืืืื.
ZMQ ืืขืจืืช ื ืืกืคืืช
ืืื ืืฉืืื ืืืช ืืื ืืชืืืืืื ืขืืืจ ืฆืืคื:
{
"command": "ืืืช",
"ืชืืื ื": {
"ืฉืึตื": ,
"ืกืืื":
}
ืืื ืืฉืืื ืืืช ืืชืืืื:
{
"command": "ืืืช",
"ืชืืื ื": {
"ืฉืึตื": ,
"pid": ,
"ืกืืื":
}
ื ืืชื ืืืฉืชืืฉ ืื ืืก ืืืคืฆืืื ืื "ืืืืื" ืืื ืืฉืืื ืืช ืืืืช ืืื ืืืืืื ืืืืงื
ืืืฉืจ ืืชืืืื ืขืฆืื:
{
"command": "ืืืช",
"ืชืืื ื": {
"ืฉืึตื": ,
"pid": ,
"ืกืืื": ,
"ืืืืื": ื ืืื
}
ืืื ืืฉืืื ืืืช ืืืื ืืชืืืื:
{
"command": "ืืืช",
"ืชืืื ื": {
"ืฉืึตื": ,
"pid": ,
"ืกืืื": ,
"child_pid": ,
}
ืืคืฉืจ ืื ืืฉืืื ืืืช ืืื ืืืื ืืฆืืคื:
{
"command": "ืืืช",
"ืชืืื ื": {
"ืฉืึตื": ,
"ืกืืื": ,
"ืืืืื": ื ืืื
}
ืืืกืืฃ, ืืชื ืืืื ืืฉืืื ืืืช ืืชืืืื ื ืืืืื, ืขื ื ืจืงืืจืกืืืืช ืืคืฉืจืืช:
{
"command": "ืืืช",
"ืชืืื ื": {
"ืฉืึตื": ,
"ืกืืื": ,
"ืจืงืืจืกืืื": ื ืืื
}
ืคืืงืื ืงื
ืืืช circusctl $ [ ] [--ืืืืื]
[--ืจืงืืจืกืืื]
ืืคืฉืจืืืืช:
ยท : ืฉื ืืฆืืคื
ยท : ืืกืคืจ ืฉืื, ืืืื ืืชืืืื.
ยท : ืืกืคืจ ืืืืช (ืื ืืฉื) ืืฉืืืื.
ยท : ืคืื ืฉื ืืื, ืื ืืืื
ยท : ืืืืืื ื, ืฉืื ืืช ืืืืช ืืื ืืืืืื
ยท : ืืืืืื ื, ืฉืื ืืช ืืืืช ืืชืืืื ืืืืืืื
ืึทืชืึธืึธื ืื ืืื ืคืืกืง or a ืฆืึนืคึถื
ืคืงืืื ืื ืืชืืืื ืืช ืื ืืชืืืืืื ืืฆืืคื ืื ืืช ืื ืืฆืืคืื.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืืชืื",
"ื ืืกืื": {
"ืฉื":' ",
"ืืืชืื": ืฉืงืจ,
"match": "[ืคืฉืื|ืืืื|ืจืืงืก]"
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืืกืืจ".
ืื ืฉื ืื ืืก ืงืืื, ืืฆืืคื ืืืคืขื.
If ืืืชื ื ืืื False (ืืจืืจืช ืืืื), ืืฉืืื ืชืืืืจ ืืื ืืืืจ ืืฉืืื ืืชืืื on
ืื ืชืืืื.
If ืืืชื ื ื ืืื, ืืฉืืื ืชืืืืจ ืจืง ืืืฉืจ ืชืืืื ืืืชืืื ืืกืชืืื ืืืืืืื.
ืืืื ืืืคืฉืจืืช graceful_timeout, ืื ืืืื ืืงืืช ืงืฆืช ืืื.
ืืฉืืืื ืืืชืืื ืคืจืืืจ ืืืื ืืงืื ืืช ืืขืจื ืคืฉืื ืืืฉืืืืช ืืืจืืืช, ืืืฉ ืขืืืจ ืชื ืืืื
ืืชืืื (ืืจืืจืช ืืืื) ืื regex ืขืืืจ ืืชืืืช ืืืืืืื ืจืืืืื.
ืคืืงืื ืงื
$ circusctl ืืคืขื ืืืืฉ [ืฉื] [--waiting] [--match=simple|glob|regex]
ืืคืฉืจืืืืช
ยท : ืฉื ืื ืชืื ืืช ืฉื ืืฆืืคื/ืื
ยท : ืฉืืืช ืืชืืื ืฉื ืฆืืคื
ืืงืื ืชืืืื infos
ืืชื ืืืื ืืงืื ืืื ืขืช ืืื ืกืืืืกืืืงืืช ืขื ืืชืืืืืื ืฉืื ืขื ืืคืงืืื stat.
ZMQ ืืขืจืืช ื ืืกืคืืช
ืืื ืืงืื ื ืชืื ืื ืกืืืืกืืืื ืขืืืจ ืื ืืฆืืคืื:
{
"command": "ืกืืืืกืืืงืืช"
}
ืืื ืืงืื ื ืชืื ืื ืกืืืืกืืืื ืขืืืจ ืฆืืคื:
{
"command": "ืกืืืืกืืืงืืช",
"ื ืืกืื": {
"ืฉืึตื":
}
}
ืืื ืืงืื ื ืชืื ืื ืกืืืืกืืืื ืขืืืจ ืชืืืื:
{
"command": "ืกืืืืกืืืงืืช",
"ื ืืกืื": {
"ืฉืึตื": ,
"ืชืืืื":
}
}
ื ืืชื ืืืจืืื ืืช ืื ืชืื ืื ืืกืืืืกืืืื ืขื ื-extend_stats ืืืง, ืื ืืฉ ืฆืืจื ืื ืชืื ืื ืกืืืืกืืืื ืืืจืืืื
ืืืงืฉ:
{
"command": "ืกืืืืกืืืงืืช",
"ื ืืกืื": {
"ืฉืึตื": ,
"ืชืืืื": ,
"ืืืจืื": ื ืืื
}
}
ืืชืืืื ืชืืื ื ืืืืฉ ืืืืืืงื ืืื ืชืืืื ืขื ืืืืคืืื "ืืืืข" ืืืืื ืชืืืื ืืืฉืื
ืืืืข:
{
"ืืืืข": {
"ืืืืื": [],
"cmdline": "ืคืืชืื",
"ืืขืื": 0.1,
"ctime": "0:00.41",
"ืื": 0.1,
"mem_info1": "3 ืืืืืื",
"mem_info2": "2G",
"ื ืืื": 0,
"pid": 47864,
"ืฉื ืืฉืชืืฉ": "ืฉืืจืฉ"
},
"ืชืืืื": 5,
"status": "ืืกืืจ",
"ืืื": 1332265655.897085
}
ืคืืงืื ืงื
$ circusctl ืกืืืืกืืืงืืช [--ืืืจืื] [ ] [ ]
ืืงืื ืื ืืื ืืฆื of a ืฆืึนืคึถื or ืืช ืื ืฆืืคืื
ืคืงืืื ืื ืืชืื ืืงืื ืืช ืืกืืืืก ืฉื ืฆืืคื ืื ืื ืืฆืืคืื.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืกืืืืก",
"ื ืืกืื": {
"ืฉื":' ",
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืคืขืื" ืื "ื ืขืฆืจ" ืื ืืช ืืกืืืืก / ืฆืืคืื.
ืคืืงืื ืงื
$ circusctl status [ ]
ืืคืฉืจืืืืช
ยท : ืฉื ืืฆืืคื
ืืืืื
$ circusctl ืกืืืืก ืืื
ืคืขืื
$ circusctl ืกืืืืก
ืืื: ืคืขืื
dummy2: ืคืขืื
ืืงืื: ืคืขืื
ืขืฆืืจ ืฆืืคืื
ืคืงืืื ืื ืขืืฆืจืช ืฆืืคื ื ืชืื ืื ืืช ืื ืืฆืืคืื.
ZMQ ืืขืจืืช ื ืืกืคืืช
{
"command": "ืขืฆืืจ",
"ื ืืกืื": {
"ืฉื": " ",
"ืืืชืื": ืฉืงืจ,
"match": "[ืคืฉืื|ืืืื|ืจืืงืก]"
}
}
ืืชืืืื ืืืืืจื ืืช ืืกืืืืก "ืืกืืจ".
ืื ืฉื ืื ืืก ืงืืื, ืืื ืืขืฆืืจื ืชืืื ืขื ืืฆืืคื
ืืชืืื ืืฉื ืื. ืืืจืช, ืื ืืฆืืคืื ืืืขืฆืจื.
If ืืืชื ื ืืื False (ืืจืืจืช ืืืื), ืืฉืืื ืชืืืืจ ืืื ืืืืจ ืืฉืืื ืืืช_ืขืฆืืจื
ืขื ืื ืชืืืื.
If ืืืชื ื ื ืืื, ืืฉืืื ืชืืืืจ ืจืง ืืืฉืจ ืชืืืื ืืขืฆืืจื ืืกืชืืื ืืืืืืื.
ืืืื ืืืคืฉืจืืช graceful_timeout, ืื ืืืื ืืงืืช ืงืฆืช ืืื.
ืืฉืืืื ืืืชืืื ืคืจืืืจ ืืืื ืืงืื ืืช ืืขืจื ืคืฉืื ืืืฉืืืืช ืืืจืืืช, ืืืฉ ืขืืืจ ืชื ืืืื
ืืชืืื (ืืจืืจืช ืืืื) ืื regex ืขืืืจ ืืชืืืช ืืืืืืื ืจืืืืื.
ืคืืงืื ืงื
$ circusctl stop [name] [--waiting] [--match=simple|glob|regex]
ืืคืฉืจืืืืช
ยท : ืฉื ืื ืชืื ืืช ืฉื ืืฆืืคื/ืื
ยท : ืฉืืืช ืืชืืื ืฉื ืฆืืคื
CLI ืืืื
ืืืค ืงืจืงืก
ืืืค ืงืจืงืก ืืื ืงืื ืกืืื ืืืืืืช ืืืืืื ืฉืชืืื ืืืคืขืื ืืื ืืฆืคืืช ืืฉืืืืจ ืื ืืืขืจืืช ื-Circus ืฉืื. ืื
ืืฆืื ืืช ื-CPU, ืฉืืืืฉ ืืืืืจืื ืืื ืืกืืช ืฉืงืข ืื ืืฉ ืื.
ืืืืื ืืคืื:
-------------------------------------------------- ---------------------
ืกืืืืกืืืงืืช ืงืจืงืก
PID CPU (%) ืืืืจืื (%)
14252 0.8 0.4
0.8 (ืืืืฆืข) 0.4 (ืกืืื)
ืืื
PID CPU (%) ืืืืจืื (%)
14257 78.6 0.1
14256 76.6 0.1
14258 74.3 0.1
14260 71.4 0.1
14259 70.7 0.1
74.32 (ืืืืฆืข) 0.5 (ืกืืื)
-------------------------------------------------- --------------------
ืืืค ืงืจืงืก ืืื ืงืื ืกืืื ืืงืจืืื ืืืื. ืื ืืชื ืจืืฆื ืืืฆืืจ ืืื ืืจืืงืฆืื ืขื ืืืขืจืืช, ืืฉืชืืฉ circusctl.
circusctl
circusctl ื ืืชื ืืืฉืชืืฉ ืืื ืืืคืขืื ืื ืคืงืืื ืืจืฉืืื ืืคืงืืืืช. ืืืืืื, ืืชื ืืืื ืืงืื ื
ืจืฉืืื ืฉื ืื ืืฆืืคืื, ืืชื ืืืื ืืขืฉืืช
ืจืฉืืืช $ circusctl
ืืืื ืชืืืื ืืงืืืฅ ืืคืฉืจืืืืช, ืืชื ืืืื ืื ืืฆืืื ืืช ื ืงืืืช ืืงืฆื circusctl ืฆืจืื
ืืืฉืชืืฉ ืืืืฆืขืืช CIRCUSCTL_ENDPOINT ืืฉืชื ื ืืกืืืื.
ืืฉืืืื ืืื ืืจื ื ืงืื ืกืื
Circus ืืืืข ืขื ืงืื ืกืืืช ืืื ืืจื ื ืฉื ืืชื ืืืฉืชืืฉ ืื ืื ืืืื ืืืขืจืืช.
ืืกืืฃ ืืืื ืืจื ื ืืืคืฉืจ ืื:
ยท ืืชืืืจ ืืื ืืขืจืืช Circus ืคืืขืืช
ยท ืฆืคื ืืชืืืืื ืฉืืืืฉ ืืืขืื ืืืืืืจืื ืืืื ืืืช
ยท ืืืกืฃ ืื ืืจื ืชืืืืืื
ยท ืืืกืฃ ืฆืืคืื ืืืฉืื
ืืขืจื:
ืชืืื ืช ืืฉืืืืฉ ืืืขืื ืืืืืจืื ืืืื ืืืช ืืฉืชืืฉืช ืืฉืงืข ืืกืืืืกืืืงื. ืื ืืชื ืจืืฆื
ืืคืขื ืืืชื, ืืื ืฉืืขืจืืช ืืกืืจืงืืก ืฉืืืื ืชืชืืืจ ืืืืื ืืช ืื ืชืื ืื ืืกืืืืกืืืื
ืืืคืขื ืืชืฆืืจื ืฉืื:
[ืงืจืงืก]
statsd = ื ืืื
ืืืจืืจืช ืืืื, ืืคืฉืจืืช ืื ืืื ื ืืืคืขืืช.
ืงืื ืกืืืช ืืืื ืืจื ื ืืื ืืืืื ืืฉืื, ืขืืื ืืืชืงืื:
$ pip ืืืชืงืื circus-web
ืืื ืืืคืขืื ืืช ืืืกืืฃ, ืืืกืฃ ืืื ืืคืฉืจืืืืช ืืงืืืฅ Circus ini:
[ืงืจืงืก]
httpd = ื ืืื
httpd_host = ืืืจื ืืงืืื
httpd_port = 8080
httpd_host ื httpd_port ืื ืืืคืฆืืื ืืืื, ืืืจืืจืช ืืืืื ืืื localhost ื 8080.
ืื ืืชื ืจืืฆื ืืืคืขืื ืืช ืืคืืืงืฆืืืช ืืืื ืืจื ื ืืื, ืคืฉืื ืืคืขื ืืช circushttpd ืชึทืกืจึดืื:
$ circushttpd
ืฉืจืช ืืงืืืงืื ืืืคืขื...
ืืืืื ืืืื http://localhost: 8080 /
ืืืฅ ืขื Ctrl-C ืืื ืืฆืืช.
ืืืจืืจืช ืืืื, ืืกืงืจืืคื ืืจืืฅ ืืช ืืกืืฃ ืืืื ืืจื ื ืืืฆืืื 8080, ืืื ืืืคืฉืจืืช --port ืืืืื ืืืืืช
ื ืื ืืฉื ืืช ืืช ืื.
ืฉืืืืฉ ืื ืืื ืื ืื
ืืืืจ ืฉืืกืงืจืืคื ืคืืขื, ืืชื ืืืื ืืคืชืื ืืคืืคื ืืืืงืจ http://localhost: 8080. ืืชื
ืฆืจืื ืืงืื ืืช ืืืกื ืืื: [ืชืืื ื]
ืงืื ืกืืืช ืืืื ืืจื ื ืืืื ื ืืืืืืจ ืืืขืจืืช Circus, ืืืชืืฉื ืื ื ืงืืืช ืกืืื. ืขื ืืื
ืืจืืจืช ืืืืื ืืื ื ืงืืืช ืืงืฆื tcp://127.0.0.1:5555.
ืืจืืข ืฉืืชื ืืื ืึฐืึทืึผึตืจ, ืืคืืืงืฆืืืช ืืืื ืืจื ื ืชืชืืืจ ืืืขืจืืช ืืงืจืงืก.
ืืืฉืจ ืงืื ืกืืืช ืืืื ืืจื ื ืืืืืจืช, ืืชื ืืืืจ ืืงืื ืจืฉืืื ืฉื ืฆืืคืื ืืกืืืืก ืืืื ืืืช
ืฉื ืฉื ื ืชืืืืื ืืงืจืงืก (ืกืืจืงืก ื-circusd-stats).
ืืชื ืืืื ืืืืืฅ ืขื ืืกืืืืก ืฉื ืื ืฆืืคื ืืื ืืขืืืจ ืืื ื Active (ืืจืืง) ื ืื ืคืขืื
(ืึธืืึนื). ืฉืื ืื ืื ืชืงืฃ ืืืืคื ืืืืื ืืืืคืฉืจ ืื ืืืชืืื ืืืขืฆืืจ ืฆืืคืื.
ืื ืชืืืฅ ืขื ืฉื ืืฆืืคื, ืชืงืื ืืฃ ืืื ืืจื ื ืขืืืจ ืืืชื ืฆืืคื ืกืคืฆืืคื,
ืขื ืืชืืืืืื ืฉืื:
ืืืกื ืื, ืืชื ืืืื ืืืืกืืฃ ืื ืืืกืืจ ืชืืืืืื ืืืืจืื ืชืืืืืื ืงืืืืื.
ืืืจืื ืืืื, ืืชื ืืืื ืืืืกืืฃ ืฆืืคื ืืืฉ ืืืืจื ืขื ืืื ืืืืฆื ืขื ืืืืกืืฃ ืฆืืคื ืงืืฉืืจ ืคื ืืื
ืืชืคืจืื ืืฉืืืื: .SS ืคืืขื ืืืืืจื Nginx
Nginx ืืืื ืืฉืืฉ ืืฉืืืช ืคืจืืงืกื ืืืืืื ืืื ืจืฉืช ืงืจืงืก.
ืืขืจื:
ืืื ืืงืื ืขืืืื ื ืกืืืืก ืืืจืคืื ืืืื ืืืช ื-circus-web, ืขืืื ืืกืคืง Nginx
ืคืชืจืื ืคืจืืงืกื ืฉืืฉ ืื ืชืืืื ื-websocket
nginx >= 1.3.13
ืืื ื-Nginx>=1.3.13 ืชืืืืช websocket ืืืื ืืช, ืื ืฉืืื ืฆืืจื ืืฉืื ืืช Nginx
ืขื ืืื ืื HAProxy. ืชืฆืืจืช Nginx ืืืืืื ืขื ืชืืืื ื-websocket:
ืืืขืื ืืืจื circusweb_server {
ืฉืจืช 127.0.0.1:8080;
}
ืฉืจืช {
ืืืงืฉืื 80;
ืฉื ืฉืจืช _;
ืืงืื / {
proxy_pass http://circusweb_server;
proxy_http_version 1.1;
proxy_set_header ืฉืืจืื $http_upgrade;
proxy_set_header ืืืืืจ "ืฉืืจืื";
proxy_set_header ืืืจื $ ืืืจื;
proxy_set_header X-Real-IP $ remote_addr;
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for $;
proxy_set_header X-Forwarded-Proto http;
proxy_redirect off;
}
ืืืงืื ~/media/\*(.png|.jpg|.css|.js|.ico)$ {
ืืื ืื /path_to_site-packages/circusweb/media/;
}
}
nginx < 1.3.13
ืืจืกืืืช Nginx < 1.3.13 ืืื ื ืืืืืืช ืชืืืื ืืืื ืืช ื-websocket.
ืืื ืืกืคืง ืชืืืื ื-websocket ืขืืืจ circus-web ืืขืช ืฉืืืืฉ ื-Nginx < 1.3.13, ืืชื ืืืื ืืฉืื
Nginx ืขื ืืื ืื HAProxy. ืืืืืจ, Nginx ืืื circus-web, ืขื Varnish ืื
HAProxy ืืื Nginx.
ืืืืืื ืืืื ืืฆืืื ืืช ืชืฆืืจืช Nginix ื- Varnish ืืืฉืืืืช ืื ืืจืฉืช ื-proxy
circus-web ืืืกืคืง ืชืืืื ื-websocket.
nginx Definitive
ืืืขืื ืืืจื circusweb_server {
ืฉืจืช 127.0.0.1:8080;
}
ืฉืจืช {
ืืืงืฉืื 8001;
ืฉื ืฉืจืช _;
ืืงืื / {
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for $;
ืืืจื proxy_set_header $ HTTP_HOST;
proxy_redirect off;
proxy_pass http://circusweb_server;
}
ืืืงืื ~/media/\*(.png|.jpg|.css|.js|.ico)$ {
ืืื ืื /path_to_site-packages/circusweb/media/;
}
}
ืื ืืชื ืจืืฆื ืขืื ืืคืฉืจืืืืช ืชืฆืืจื ืฉื Nginx, ืจืื http://wiki.nginx.org/HttpProxyModule.
ืืจื ืืช Definitive
ืืจืืจืช ืืืืื ืืืืืจืืช {
.host = "127.0.0.1";
.port = "8001";
}
ืฉืงืข ืืืืจื {
.host = "127.0.0.1";
.port = "8080";
โ.connect_timeout = 1s;
.first_byte_timeout = 2 ืฉื ืืืช;
.between_bytes_timeout = 60 ืฉื ืืืช;
}
sub vcl_pipe {
if (req.http.upgrade) {
set bereq.http.upgrade = req.http.upgrade;
}
}
sub vcl_recv {
if (req.http.Upgrade ~ "(?i)websocket") {
set req.backend = socket;
ืืืจื (ืฆืื ืืจ);
}
}
ืืืืืื ืฉื ืชืฆืืจืช Varnish ืืขืื ืืืืืจืื ืฉื ื ืงืฆื ืืืืจืืื. ืืื ืืืฉืจืช ืืช ืืืื ืืจื ื
ืงืื ืกืืื ืืืื ืืืฉืจืช ืืช ืืืืืจื ืืฉืงืข. ืืงืฉืืช ืงืื ืกืืืช ืืืื ืืจื ื ืืืืืื ืืืฆืืื
8001. ืืฉ ืืืืืืจ ืืช ืืื ืืื 'ืฉืจืช' ืฉื Nginx ืืืืื ื ืืืฆืืื 8001.
ืืืืืจื Websocket ืืฉืืืจืืื ืืืืขืืจืื ืืฉืืจืืช ืืชืืืื ืืืื ื ืฉื circushttpd
ืขื ื ืื 8080 ืขื ืืื Varnish. ืืืืืจ ืขืงืืคืช ืคืจืืงืกื Nginx.
ืืืืื ืื
ืืื ืืืจืกื 13.10 (ืกืืืกื), ืืืืื ืื ืืืืืช Nginx ืขื ืชืืืื ื-websocket ืืคื ื ืขืฆืื
ืืืืจืื. ืขืืืจ ืืจืกืืืช ืืฉื ืืช ืืืชืจ, ืืชื ืืืื ืืืชืงืื Nginx>=1.3.13 ืื-Nginx ืืจืฉืื
PPA ืืฆืื, ืื:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:nginx/stable
ืขืืืื sudo apt-get
sudo apt-get ืืืชืงืื nginx
nginx -v
ืืื ืืืืฆืขืืช ืกืืกืื circushttpd
ืืคื ืฉืืืกืืจ ืืืฃ ืืืืืื, ืคืืขื circushttpd ืืื ืื ืื ืืืื. ืื ืื ื ืื ืืกืคืงืื
ืื ืืืืื ืืกืืจืงืืก ืขืฆืื, ืืื ืืชื ืืืื ืืืื ืขื ืืงืื ืกืืื ืฉืื ืืจืืช NGinx, ืขื ืืื
ืืืืฆืขืืช http://wiki.nginx.org/HttpAuthBasicModule
ืืืืื:
ืืงืื / {
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for $;
ืืืจื proxy_set_header $ HTTP_HOST;
proxy_set_header X-Forwarded-Host: $http_host;
proxy_set_header X-Forwarded-Proto: $scheme;
proxy_redirect off;
proxy_pass http://127.0.0.1: 8080;
auth_basic "ืืืืื";
auth_basic_user_file /path/to/htpasswd;
}
ืืฉืืืื htpasswd ืืงืืืฅ ืืืื ืืฉืชืืฉืื ืืืช ืืกืืกืืืืช ืฉืืื, ืืืชื ืชืืคืืข ืืงืฉืช ืกืืกืื
ืืชื ื ืืืฉ ืืงืื ืกืืื.
ืืชื ืืืื ืืืฉืชืืฉ ืืกืงืจืืคื htpasswd ืฉื Apache ืืื ืืขืจืื ืืืชื, ืื ืืกืงืจืืคื Python ืฉืื ืืกืคืงืื ื:
http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py
ืขื ืืืช, ืืื ืชืืืื ืืงืืจืืช ืืฉืืืืฉ ืืืฉืืื ื-HTTP Authentication ื
WebSockets (ืืฉืจืช ืืืจืืง ืงืืื ืฉืืืื ืฉื HTTP 401). ืืจื ืืขืงืืคืช ืืืขืื ืืื ืืืฉืืืช ืืืื
ืืืืืช ืขืืืจ ืฉืจืช socket.io.
ืืืืื (ืืฉ ืืืืกืืฃ ืืคื ื ืืืื ืืงืืื):
ืืืงืื /socket.io {
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for $;
ืืืจื proxy_set_header $ HTTP_HOST;
proxy_set_header X-Forwarded-Host: $http_host;
proxy_set_header X-Forwarded-Proto: $scheme;
proxy_redirect off;
proxy_pass http://127.0.0.1: 8080;
}
ืืืืื ืฉืื ืจืง ืืจื ืืืช ืืืื ืขื ืงืื ืกืืืช ืืืื ืืจื ื ืฉืื, ืืชื ืืืื ืืืฉืชืืฉ ืจืืืช ืืืจืืช
ืืื ืืงืืช.
ืืืจืื ืื ืืื ืืื ืืจื ื ืื ืื
ืืืจื ื ืืงืืืง ืืื ืืช ืืช ืงืื ืกืืืช ืืืื ืืจื ื, ืืขืืงืจ ืืืื ืฉืื ืืกืืจืช ืืืฉ ืืขืืจื
ืื ืขืืฉื ืืจืื. ืขืืื ืืงืื ืฉื ืงืื ืกืืืช ืืืื ืืจื ื, ืืกืืคื ืฉื ืืืจ ืชืืฆื
ืืืืฆื ืฉืื ืืืฉ ืคืฉืื ืืืื ื.
ืื ื ืืื ืื ืืืืืง:
ยท circushttpd.py ืืงืืืฅ ืืืื ืืช ืืืืจืืช "ืชืฆืืืืช" ืืงืฆืช ืงืื ืืืืคืื ื
ืืืืืจ ืฉืงืข (ืืืืฆืขืืช socketio).
ยท ื controller.py ืืืื ืืืืงื ืืืช ืฉืืืจืืืช ืขื ืืืฆืืข ืืชืงืฉืืจืช
ืขื ืืงืจ ืืงืจืงืก. ืื ืืืคืฉืจ ืืงืื API ืืจืื ืืืืื ืืืชืจ ืืฉืืืืืจืื ืืช
ืฉืจืช ืืื ืืจื ื.
ืื ืืจืฆืื ื ืืืืกืืฃ ืชืืื ื ืืงืื ืกืืืช ืืืื ืืจื ื, ืชืืื ืืขืฉืืช ืฉืืืืฉ ืืืืจ ืืงืื ืืงืืื. ื
ืืื ืืืื ืขืืืืื ืืจืฉืืชื ืืื ืืืงื ืขื ืืชืืืื:
ยท ืืฉ ืืืงืื ืคืื ืงืฆืื, ืฉืืืงืืช ืืช ืืืจืืืื ืืื ืืขืื ืืฉื ืฉืืชื ืืขืืืจ ืืืื ื
ืืืขืืืจ ืืืชื ืืืขืื ืืชืื ืืืช ืืืืืืืจ ืืช ื-HTML ืฉื ืืฆืจ. ืื ืื ืขืืืจ ืืืง
ืืฉืชื ืื ื ืืกืคืื, ืืืื ืืคืืืฉื, ืืจืกืช ืืงืจืงืก ืืืืงืื ืื ืืืืืจ.
ยท ืื ืืชื ืจืืฆื ืืืจืืฅ ืคืงืืืืช ืืืขืฉืืช ื ืืชืื ืืืืฉ ืืืชืื ืืชืืฆืื ืฉื ืื, ืืชื ืืืื ืืืฉืชืืฉ
ืื ืืื run_command ืคืื ืงืฆืื, ืฉืืืงืืช ืืจืืืื ื ืฉื ืืชื ืืงืจืื ืืืจืืืื ื ืจืืฉืื, ืืืืขื ืืืงืจื
ืฉื ืืฆืืื ืืืชืืืช ืืชืจ ืืืคื ืื ืืืืฉ.
ืืฉืืืื ืืจืื ื ืชืื ืื ืกืืืืกืืืื class ืืืจืืืช ืื ืืืื ืชืงืฉืืจืช ื-websocket ื-
ืืฆื ืืฉืจืช. ืืชืืขืื ืฉืื ืืืืจ ืืขืืืจ ืื ืืืืื ืื ืืื ืขืืฉื.
ืขืืืื ืขื ืืจืืืืช
Circus ืืืื ืืืื ืฉืงืขื ืจืฉืช ืืื ืื ืืืชื ืืคื ืฉืืื ืขืืฉื ืขืืืจ ืชืืืืืื.
ืืจืขืืื ืืืจืืื ืืื ืฉืชืืืื ืืื ืฉื ืืฆืจ ืขื ืืื ืงืจืงืก ืืื ืืืคืขืื ืืช ืืื ืืฆืืคืื
ืืคืงืืื ืืืืื ืืจืฉืช ืืื ืืชืืจื ืืงืืืฅ ืฉื ืคืชืื.
ืื ืขืืื ืืคืืฆ'ื ืื ืื ืงืจื, ืืืืื ืจืืื ืืืจืื ืืืืฅ.
ืืืจื
ืืืืจื ืฉื ืฉืงืขืื ืืื ืืืืื ืขื ืืื Circus ืืื ืืืืืช ืืกืืืืื ืื ืื ืืคืืืงืฆืืืช ืจืฉืช
ืืงืจืงืก ืืืืืง ืืื ืืคืืืงืฆืืืช ืืืจืืช.
ืืืืืื, ืื ืืชื ืืฉืชืืฉ ืืกืืจืงืืก ืขื ืึถืจึถื -- ืฉืจืช WGSI, ืืชื ืืืื ืืงืื ืฉืจืช ืืืืจ ืืืื
ืฉืจืช ืืื ืืจื ื ืคืืขื ืืื ืื "ืืื ืืจื ื ืขืืืืื" ืืงืจืงืก ืืคื ืฉืืืืช ืขืืฉื ืขืืืจ ืื ืืื ืืืจ
ืืชืืืื.
ืคืืฆืื ื ืืืื ืืฉืงืขืื ืืืคืืืงืฆืืืช ืืจืฉืช ืขืฆืื ืืฆืืข ืืจืื
ืืืืื ืืืืช ืืืจืืื ืืื ืื ืืช ืืขืจืืื ืฉืื.
ืขืืฆืื
ืขืืงืจ ืืชืืื ื ื ืขืฉื ืขื ืืื ืงืฉืืจืช ืืฉืงืข ืืืชืื ืืืืืื ืื ืคื ืืื
ืงืจืงืก:
ืฉืงืข ืืืื
sock = socket.socket(FAMILY, TYPE)
sock.bind((HOST, PORT))
sock.listen(BACKLOG)
fd = sock.fileno()
ืืืืจ ืืื ืงืจืงืก ืขืืงื ืืืจ ืื ื-fds ืฉื ืคืชืื, ืื ืืชื ืืชืืืืืื ืฉืืื ืืจืืฅ ืืืืืืชื
ืืฉ ืืื ืืืฉื ืืืืื ืื ืื ืจืืฆืื.
ืื ืชืืฆืืจ ืกืงืจืืคื ืจืฉืช ืงืื ืฉื Python ืฉืืชื ืืชืืืื ืืืคืขืื ื-Circus, ืื ืืืื
ื ืจืื ืืื ืื:
ืฉืงืข ืืืื
ืืืืื
fd = int(sys.argv[1]) # ืืงืื ืืช ื-FD ืืืงืจืงืก
sock = socket.fromfd(fd, FAMILY, TYPE)
# ืืืคืื ืืืงืฉื ืืืช ืืื ืคืขื
ืืขืื ื ืืื:
conn, addr = sock.accept()
ืืงืฉื = conn.recv(1024)
.. ืชืขืฉื ืืฉืื ..
conn.sendall(response)
conn.close()
ืื ืงืจืงืก ืืืื ืืจืืฅ ืื:
[ืงืจืงืก]
check_delay = 5
ื ืงืืืช ืงืฆื = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
stats_endpoint = tcp://127.0.0.1:5557
[ืฆืืคื:ืืื]
cmd = mycoolscript $(circus.sockets.foo)
use_sockets = ื ืืื
delay_warmup = 0
ืืกืคืจ ืชืืืืืื = 5
[socket:foo]
ืืืจื = 127.0.0.1
ืืฆืืื = 8888
$(circus.sockets.foo) ืืืืืฃ ืืขืจื FD ืืืืจ ืืฆืืจืช ืืฉืงืข ื
ืงืฉืืจ ื-8888 ื ืื.
ืืขืจื:
ืืื ื-Circus 0.8 ืืฉ ืชืืืืจ ืืืืคื ืืื ืืื ืืข ืืชื ืืฉืืืืช ืืกืืืืืช ืขื ืืื
ืื ืชืื ืชืฆืืจื. ืืชื ืืืื ืืืชืื:
((circus.sockets.foo))
ืขืืื ืืืืชื ืืืืื
ืึถืจึถื ืืื ืืืืืื ืืืืฉืื ืืกืืจืงืืก ืื ืืชื ืจืืฆื ืืืคืขืื ืืช ืืคืืืงืฆืืืช WSGI ืฉืื.
ืืืืจ ืืืชืงื ื, ืืคืขืืช 5 ืืืืืืื ืขืืืืื ื ืืชื ืืขืฉืืช ืขื ืืื ืืฆืืจืช ืฉืงืข ื
ืงืืจื ื ืึถืจึถื ืคืงืืื ืืขืืื, ืื:
[ืงืจืงืก]
ื ืงืืืช ืงืฆื = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
stats_endpoint = tcp://127.0.0.1:5557
[watcher:web]
cmd = chaussette --fd $(circus.sockets.web) --backend meinheld mycool.app
use_sockets = ื ืืื
ืืกืคืจ ืชืืืืืื = 5
[socket:web]
ืืืจื = 0.0.0.0
ืืฆืืื = 8000
ืขืืืื ืื ืคืจืกืื ื ืืืืื, ืืื ืืฉืืื ืืื ืืจื ื ืื ืืืืื ืฉื Circus ืขื Gevent ืื
ืืงืฆื ืืืืืจื ืฉื Meinheld ืืื ืืืืจ ืืื ืื ืฉืจืช WSGI pre-fork ืืืืฅ.
ืฉืืืืฉ ืืืื ื ืชืืกืคืื
Circus ืืืืข ืขื ืืื ืชืืกืคืื ืืืื ืื. ืกืขืืฃ ืื ืืฆืื ืืช ืืชืืกืคืื ืืืื ืืฉืืื
ืืคืฉืจืืืืช ืชืฆืืจื.
ืกืืืืกืืืงื
ืืืฉืชืืฉ ืืืืืจ ื'circus.plugins.statsd.StatsdEmitter'
ืฉื ืืคืืืงืฆืื
ืืฉื ืืืฉืืฉ ืืืืืื ืงืืืืืช ืืืื ืฉืืืื ืืฉืืื ืืช ืื ืชืื ืื ืืกืืืืกืืืื (ืื ืืืื
ืขื ืงืืืืืช ืงืจืงืก. ืืืืกืื ืขื .ืฆืึนืคึถื)
ืืืืจื ืืืืจื ืฉืืืื ืืฉ ืืคืจืกื ืืช ื ืชืื ื ื-statds
ื ืื ืืืฆืืื ืฉืืืืื ื-statsd ืืืืื ืื
ืงืฆื ืืืืื
ืื ืืชื ืืขืืืฃ ืงืฆื ืืืืื ืฉืื ื ื-1, ืืชื ืืืื ืืืืืืจ ืืืชื ืืื
ื ืชืื ืื ืืืืื
ืืจืืื ืืชืืกืฃ Statsd ืฉืืคืจืกืืช ืื ืืช ืกืืืืกืืืงืช ืืชืืืื. ืืืื ืื
ืืฉ ืืช ืืืชื ืืคืฉืจืืืืช ืชืฆืืจื ืืื Statsd ืืืืืื.
ืืืฉืชืืฉ ืืืืื ื circus.plugins.statsd.FullStats
loop_rate
ืืชืืืจืืช ืฉืืชืืกืฃ ืฆืจืื ืืืงืฉ ืืช ืื ืชืื ืื ืืกืืืืกืืืื ืืฉื ืืืช. ืืจืืจืช ืืืื: 60.
RedisObserver
ืฉืืจืืช ืื ืืฉืงืืฃ ืขืืืจื ืืชืืืื ื ืืชืื ืืืืฉ, ืืคืจืกื ืืช ืืืืืข ื-statsd
ืืืฆืืข ืืืคืขืื ืืืืฉ ืืช ืืฆืืคื ืืืฉืจ ืืื ืื ืืืื ืืืื ืงืฆืื ื ืชืื. ืืชืืกืฃ ืืื
ืืืจืฉ redis-py ืืจืืฅ.
ืืฉ ืื ืืืชื ืชืฆืืจื ืืื statd ืืืืกืืฃ ืืช ืืืืจืื ืืืืื:
ืืืฉืชืืฉ ืืืืื ื circus.plugins.redis_observer.RedisObserver
loop_rate
ืืชืืืจืืช ืฉืืชืืกืฃ ืฆืจืื ืืืงืฉ ืืช ืื ืชืื ืื ืืกืืืืกืืืื ืืฉื ืืืช. ืืจืืจืช ืืืื: 60.
redis_url
ืืกื ืื ืชืื ืื ืฉืืฉ ืืืืืง ืืืชื ืืืชืืืช ืืชืจ redis. ืืจืืจืช ืืืื: "redis://localhost:6379/0"
ืคืกืง ืืื
ืืืื ืืงืฆืื ืืฉื ืืืช ืฉืืืงืฉื ืขืฉืืื ืืืืืฉื ืืคื ื ืฉืืื ื ืืฉืืช ืืืฉืืชืช.
ืืจืืจืช ืืืืื ืืื 5.
restart_on_timeout
ืฉื ืืชืืืื ืืืคืขืื ืืืืฉ ืืืฉืจ ืชื ืืืื ืืงืฆืื ืฉื ืืืงืฉื. ืืื ืืคืขืื ืืืืฉ
ืืืคืขื ืืืฉืจ ืื ื ืืชื. ืืจืืจืช ืืืื: ืืื.
HttpObserver
ืฉืืจืืช ืื ืืฉืงืืฃ ืขืืืจื ืืชืืืื http ืขื ืืื ืคืื ื ืืืชืจ ืืกืืื ืืืืคื ืงืืืข.
ืืืืื ื-redis observer ืืื ืืฆืืข ืืืคืขืื ืืืืฉ ืืช ืืฆืืคื ืขื ืฉืืืื. ืื ืืืจืฉ
ืืืจื ืื ืืจืืฅ.
ืืฉ ืื ืืืชื ืชืฆืืจื ืืื statd ืืืืกืืฃ ืืช ืืืืจืื ืืืืื:
ืืืฉืชืืฉ ืืืืื ื circus.plugins.http_observer.HttpObserver
loop_rate
ืืชืืืจืืช ืฉืืชืืกืฃ ืฆืจืื ืืืงืฉ ืืช ืื ืชืื ืื ืืกืืืืกืืืื ืืฉื ืืืช. ืืจืืจืช ืืืื: 60.
check_url
ืืชืืืช ืืืชืจ ืฉืฆืจืื ืืืืืง. ืึผึฐืจึดืืจึทืช ืึถืืึธื: http://localhost/
ืคืกืง ืืื
ืืืื ืืงืฆืื ืืฉื ืืืช ืฉืืืงืฉื ืขืฉืืื ืืืืืฉื ืืคื ื ืฉืืื ื ืืฉืืช ืืืฉืืชืช.
ืืจืืจืช ืืืืื ืืื 10.
restart_on_error
ืฉื ืืชืืืื ืืืคืขืื ืืืืฉ ืืืฉืจ ืชื ืืืื ืืงืฆืื ืืืงืฉื ืื ืฉืืืืืจื ืืงืฉื ืืืฉืื
ืกืื ืืืจ ืฉื ืฉืืืื. ืื ืืืคืขืืช ืืืืฉ ืืืฉืจ ืื ื ืืชื. ืืจืืจืช ืืืื: ืืื.
ResourceWatcher
ืฉืืจืืช ืื ืฆืืคื ืืืฉืืืื ืฉื ืืชืืืื ืื ืชืื ืืืคืขืื ืืคืขืื ืืืืฉ ืืืฉืจ
ืื ืืืจืืื ืืืืืืืช ืืกืืืืืช ืืขืชืื ืงืจืืืืช ืืื ืืจืฆืืคืืช.
ืืฉ ืื ืืืชื ืชืฆืืจื ืืื statd ืืืืกืืฃ ืืช ืืืืจืื ืืืืื:
ืืืฉืชืืฉ ืืืืื ื circus.plugins.resource_watcher.ResourceWatcher
loop_rate
ืืชืืืจืืช ืฉืืชืืกืฃ ืฆืจืื ืืืงืฉ ืืช ืื ืชืื ืื ืืกืืืืกืืืื ืืฉื ืืืช. ืืจืืจืช ืืืื: 60.
ืฆืึนืคึถื
ืืฆืืคื ืฉืฉืืืจ ืืืฉืื ืืื ืฆืจืื ืืืืื ืื. (ื ืงืจื ืืขืืจ
ืฉืจืืช ืืื ืฉืจืืช ืืืฆื ืืขืช ืืฉืืืืฉ)
max_cpu
ืืืขืื ืืืงืกืืืื ืฉื ืชืืืื ืืื ืืืชืจ ืืฆืจืื (ื%). ืืจืืจืช ืืืื: 90
min_cpu
ืืืขืื ืืืื ืืืื ืฉืชืืืื ืืื ืฆืจืื ืืฆืจืื (ื%). ืืจืืจืช ืืืื: ืืื (ืืื ืืื ืืืื)
ืืชื ืืืื ืืืืืืจ ืืช min_cpu ื-0 (ืืคืก), ืืืงืจื ืื ืื ืชืืืื ืืื ืฆืืจื ืืืืืง
0% ืืขืื, ืื ืืคืขืื ืืช ืืืืื ืืืืจื.
max_mem
ืืืืช ืืืืืจืื ืฉืืืชืจ ืชืืืื ืืื ืฉื ืืฆืืคื ืืื ืืฆืจืื. ืึผึฐืจึดืืจึทืช ืึถืืึธื:
90. ืื ืื ืฆืืื ื ืืืืื, ืืขืจื ืืื ืืืืืืื. ืืืืื: 50 ืื ืืืืื ืืื
ืฉืฆืืื, ืืขืจื ืืื ืืืชืื. ืืืืืืืช ืื ืชืืืืช ืื B, K, M, G, T, P, E, Z, Y.
ืืืืื: 250 ืืืืืื
min_mem
ืืืืืจืื ืืืื ืืืื ืฉืชืืืื ืืื ืฉื ืืฆืืคื ืืื ืฆืจืื ืืฆืจืื. ืืจืืจืช ืืืื: ืืื (ืื
ืึดืื ึดืืืึผื). ืื ืื ืฆืืื ื ืืืืื, ืืขืจื ืืื ืืืืืืื. ืืืืื: 50 ืื ืืืืื ืืื
ืฉืฆืืื, ืืขืจื ืืื ืืืชืื. ืืืืืืืช ืื ืชืืืืช ืื B, K, M, G, T, P, E, Z, Y.
ืืืืื: 250 ืืืืืื
ืกืฃ_ืืจืืืืช
ืืืจืืืืช ืืื ืืืืืฆืข ืฉื ืืืขืื ืืืืืืจืื (ื%) ืฉื ืชืืืืื ืืฆืืคื
ืืืชืจ ืืฆืจืื (ื%). ืืจืืจืช ืืืื: 75
max_count
ืืืืื ืชืืืจืืช ืืืชืจ ืืืืืื ืืช ืืืืืืืช ืืืื (ืื ืืื ืืื ื ืกืคืจ ืื ืคืจื).
ืืจืืื ืืคื ื ืฉืชืืคืขื ืืคืขืื ืืืืฉ. ืืจืืจืช ืืืื: 3
ืืืืื:
[ืงืจืงืก]
; ...
[ืฆืืคื:ืชืืื ืืช]
cmd = ืฉืื ื 120
[plugin:myplugin]
use = circus.plugins.resource_watcher.ResourceWatcher
ืฆืืคื = ืชืืื ืืช
min_cpu = 10
max_cpu = 70
min_mem = 0
max_mem = 20
ืืื ืฉืืืจื
ืชืืกืฃ ืฉืืงืฉืจ ืฉืงืข udp ืืืืื ืืืืืขืืช Watchdog. ืขืืืจ "ืืฉืืจ"
ืชืืืืืื, ืืื ืืฉืืืจื ืืืจืื ืืืชื ืื ืื ืื ืืฉืืื ืคืขืืืช ืื ืืืื ืืกืืื
ืคืจืง ืืื ืฉืืชืืืฉ ืืคื loop_rate * max_count. (ืงืจืงืก ืืืื ืืืืืืื
ืืคืขื ืืืืฉ ืืช ืืชืืืืืื ืืืกืจืื ืืฆืืคื)
ืื ืชืืืื ืื ืืืจ ืฆืจืื ืืฉืืื ืืืืขืช udp ืืคืืืช ื-loop_rate. ื-udp
ืคืืจืื ืืืืืขื ืืื ืฉืืจืช ืืงืกื, ืืคืืขื ืืช ืืืืฆืขืืช msg_regex ืคึผึธืจึธืึถืึถืจ. ืคืขืืืืช ืืื
ืืืืืขื ืืืืืช ืืืืื ืืคืืืช ืืช ื-PID ืฉื ืชืืืื ืฉืืืืช ืืืืืขื.
ืจืฉืืืช ืืฆืืคืื ืืื ืืืจืื ื ืงืืขืช ืืคื ืืคืจืืืจ watchers_regex ื
ืชืฆืืจื.
ืคืจืืืจื ืชืฆืืจื:
ืืืฉืชืืฉ ืืืืื ื circus.plugins.watchdog.WatchDog
loop_rate
ืงืฆื ืืืืืื ืฉื ืืื ืืฉืืืจื ืืฉื ืืืช. ืืื ืืืืื, WatchDog ืืืคืฉ "ืืชืื"
ืชืืืืืื.
watchers_regex
regex ืขืืืจ ืืชืืืช ืฉืืืช ืฆืืคืื ืฉืืืืจืื ืืืืืช ืืืขืงื ืขื ืืื ืืื ืืฉืืืจื
(ืึผึฐืจึดืืจึทืช ืึถืืึธื: .* ืื ืืฆืืคืื ืื ืืืจืื)
msg_regex
regex ืขืืืจ ืคืขื ืื ืืืืขืช ืคืขืืืืช ืืื ืฉืืชืงืืื ื-udp (ืืจืืจืช ืืืื:
^(?P .*);(?P .*)$) ืคืืจืื ืืจืืจืช ืืืืื ืืื ืืืืขืช ืืงืกื ืคืฉืืื:
pid;ืืืชืืช ืืื
max_count
ืืืกืคืจ ืืืจืื ืฉื ืืืืืื ืฉืขืืจื ืืื ืงืืืช ืคืขืืืืช ืื ืืคื ื ืืคืขืื ืืืืฉ
ืชืืืื (ืืจืืจืช ืืืื: 3)
ip ip ืืื ืืฉืืืจื ืืืืื (ืืจืืจืช ืืืื: 127.0.0.1)
ื ืื ืืฆืืื ืฉืืื ืืฉืืืจื ืืืืื (ืืจืืจืช ืืืื: 1664)
ืืชื ืคื ืฃ
ืืืฉืจ ืขืืื ืืชืืื ืืขืชืื ืงืจืืืืช ืืื, ืื ื ืืืืจืื ืฉืื ืืชื ืคื ืฃ. ืชืืกืฃ ืื ืขืืงื ืืืจืื
ืฉื ืืขืืื ืืคืขืื ืืืืฉ ืืืคืกืืง ืืช ืืฆืืคื ืืืงืืื ืืืงืจื ืฉืืื ืืชื ืืคืฃ. ืึถื
ื ืืชื ืืืฉืชืืฉ ืืชืืกืฃ ืืื ืืขืฆืืจ ืืืืืืืืช ืขืืืืื ืืืืคืขืืื ืืืืฉ ืื ืืืื ืืืื
ืื ืื ืขืืืืื ืืื ืฉืฆืจืื.
ืืืฉืชืืฉ ืืืืื ื ืชืืกืคื ืงืจืงืก. ืืชื ืคื ืคืื. ืืชื ืคื ืคืื
ื ืืกืืื ืืช
ืืกืคืจ ืืคืขืืื ืฉืชืืืื ืืืื ืืืชืืื ืืืืฉ, ืืชืื ืืืื ืฉื ืืืช, ืืคื ื ืฉืื ืื ื
ืชืืฉืื ืฉืื ืืชื ืืคืฃ (ืืจืืจืช ืืืื: 2)
ืืืื ืืืื ืืืื ืืฉื ืืืช ืืืืืงืช ืืชื ืืคืคืืช. ืื ืืชืืืื ืืชืืื ืืืืฉ ืืืชืจ
ืึตืึฒืฉืึถืจ ื ืืกืืื ืืช ืคืขืืื ืืชืื ืืืื ืืืื ืืื, ืื ื ืจืืืื ืืื ืชืืืื ืืชื ืืคืฃ.
(ืืจืืจืช ืืืื: 1)
ื ืกื ืฉืื ืืขืื
ืืื ืืฉื ืืืช ืืืืืช ืขื ืฉื ื ืกื ืืืชืืื ืฉืื ืชืืืื ืฉืืื
ืืชื ืืคืคืช. (ืืจืืจืช ืืืื: 7)
max_retry
ืืกืคืจ ืืคืขืืื ืฉืื ื ืื ืกืื ืืืชืืื ืชืืืื ืฉืืชื ืืคืฃ ืืขืืจ
ืื ืื ื ื ืืืฉืื ืืขืืฆืจืื ืืช ืื ืืฆืืคื. (ืืจืืจืช ืืืื: 5) ืืืืจ ื-1 ืืื ืืืฉืืืช
max_retry ืื ืกื ืฉืื ืืื ืืืืืช ืืื.
ืคืขืื ืืืืืืจ ืื ืืคืืืืื ืคืขืื ืื ืื (ืืจืืจืช ืืืื: True). ืื ืืืื ืืขืืืื ืืื
ืืืืืจ ื-false, ืืชืืกืฃ ืื ืืืคืขื.
ื ืืชื ืืขืงืืฃ ืืช ืืืคืฉืจืืืืช ืืงืืข ืืฆืืคื ืืืืฆืขืืช ื ืืชื ืืคืคืช. ืงืืืืืช. ืืืืืื,
ืื ื ืืื ืชืืืืจ ืกืคืฆืืคื max_retry ืขืจื ืขืืืจ nginx:
[watcher:nginx]
cmd = /path/to/nginx
flapping.max_retry = 2
[watcher:myscript]
cmd = ./my_script.py
; ... ืฆืืคืื ืืืจืื
[plugin:flapping]
use = circus.plugins.flapping.flapping
max_retry = 5
CommandReloader
ืชืืกืฃ ืื ืืคืขืื ืืืืฉ ืืช ืืฆืืคืื ืืืฉืจ ืงืืืฅ ืืคืงืืื ืฉืืื ืืฉืชื ื. ืื ืขืืื ืืคื
ืืืืงืช ืืื ืืฉืื ืื ืืื ืชืื ืฉื ืืงืืืฅ ืฉืืฆืืืข ืขื ืืื ื- cmd ืืคืฉืจืืช ืื
loop_rate ืฉื ืืืช. ืื ืขืฉืื ืืืืืช ืฉืืืืฉื ืืขืช ืคืืชืื ืชืืืืื ืขืืืื ืื ืืคืืื ืขืืืจ ืื
ืฉืืจืื ืงืื ืืืืฆืืจ.
ืืืฉืชืืฉ ืืืืื ื circus.plugins.command_reloader.CommandReloader
loop_rate
ืืชืืืจืืช ืฉืืชืืกืฃ ืฆืจืื ืืืืืง ืื ืืฉ ืฉืื ืืืื ืืฉื ืืืช. ืืจืืจืช ืืืื: 1.
ืคึผึฐืจึดืืกึธื
ืืืจืืช ืฉื ืืชื ืื ืื ืืช ืืืื ืืงืจืงืก ืขื ืืคืงืืื circusd, ืงื ืืืชืจ ืืงืื ืืืชื
ืืืชืืื ืืืชืืื. ืื ืืืขืจืืช ืฉืื ืชืืืืช ื-Upstart, ืชืืื ืืืฆืืจ ืืช ืืกืงืจืืคื ืฉื Upstart ืื ื
/etc/init/circus.conf.
ืืชืื ืขื ืืขืจืืช ืืงืืฆืื ื-net-device-up IFACE=lo
ืขืฆืืจ ืืจืืช ืจืืฆื [016]
respawn
exec /usr/local/bin/circusd /etc/circus/circusd.ini
ืื ืืื ืื ืฉ-circusd.ini ื ืืฆื ื-/etc/circus/circusd.ini. ืืืืจ ืืชืืื ืืืืฉ, ืืชื
ืืืื ืืฉืืื ืขื circusd ืขื ืคืงืืืช ืืฉืืจืืช:
# ืืชืืื/ืขืฆืืจื/ืืคืขืื ืืืืฉ ืฉื ืงืจืงืก ืฉืืจืืช
ืื ืืืขืจืืช ืฉืื ืชืืืืช ื-systemd, ืชืืื ืืืฆืืจ ืงืืืฅ ืืืืืช systemd ืื ืชืืช
/etc/systemd/system/circus.service.
[ืืืืื]
ืชืืืืจ=ืื ืื ืชืืืืื ืงืจืงืก
After=syslog.target network.target nss-lookup.target
[ืฉืึตืจืึผืช]
ืกืื = ืคืฉืื
ExecReload=/usr/bin/circusctl ืืขื ืืืืฉ
ExecStart=/usr/bin/circusd /etc/circus/circus.ini
ืืคืขื ืืืืฉ = ืชืืื
RestartSec = 5
[ืืืชืงืื]
WantedBy=default.target
ืื ื ืืจืฉ ืืชืืื ืื ืืชื ืืคืขืื ืืช ืคืงืืืช daemon-reload ืืืื:
# systemctl --system daemon-load reload
ืื ื ืืชื ืื ืื ืืช ืืงืจืงืก ืืืืฆืขืืช:
# systemctl start/stop/status/load reload circus
ืืชืืื ืื
ืืืง ืื ืืืื ืืชืืื ืื ืืคืจืืกืช ืงืจืงืก. ืขื ืื ืืชื ืืืื ืืืกืชืื ืืฆื ืคืื
ืึผืึผืึผึธื ืืชืืื ืื ืืฆื ืจืื ืฉืึถืฃ ืืชืืื
ืืคืืคืืืจ ืืชึทืึฒืึดืื ืึทืจืขึดืื
ืืขืื ืืืช ืืืฉืืชืคืช ืืื ืืื ืชืืืืืื ืืื ืฉืืื ื ืืืื ืืืคืขืื ืืืืฉ ืืช ืื ืื ืืชืืืืืื
ืืืื ืืืคืขืื ืืืืฉ ืืช ืื ืืชืืืืืื ืฉืืื ืื ืื. ืื ืืงืฉื ืขื ืคืจืืกืช ื
ืืจืกื ืืืฉื ืฉื Circus ืื ืืจืกืืืช ืืืฉืืช ืฉื ืื ืืืช ืืืกืคืจืืืช ืฉืืื ืื ืชืืื.
ืื ืืชื ืขื ืืขืจืืช ืืกืื Unix, Circus ืืืื ืืืฉืชืืฉ ืืืืืช ืชืืืื Papa. ืืฉืืฉืชืืฉืื ืื, ืืื
ืชืืฆืืจ ืืืื ืืจืื ืืืื ืฉืืฉืืฉ ืืืืจื ืืื ืชืืืืืื ืืฉืงืขืื
ืืชื ืืืฆืจ ืขื ืื. ืื ืืงืจืงืก ืืืกืืจ, ืืื ืืฉืืืจ ืขื ืื ืื ืฉืืื ืืืจื.
ืืชืงื ื
ืืชืื ืืืชืงื ืช ื ืืื ื setproctitle ืืืืืืื:
pip ืืืชืงืื ืืื
pip ืืชืงื ืช setproctitle
ืืฉืืืื setproctitle ืืืืืื ืืื ืืืคืฆืืื ืื. ืืื ืืฉืืฉ ืื ืงืืื ืืื ืืฉื ืืช ืืช ืฉื ืืืื ืืคืคื
ื ืืืง ืขืืืื ื ps ืืืฉืื ืืื "ืืืื ืืื ืืืงืจืงืก". ืื ืื ืชืชืงืื ืืช
setproctitle ืืืืื, ืืืชืจืช ืื ืชืืื ืฉืืจืช ืืคืงืืื ืฉื ืืชืืืื ืฉืืคืขืื ืืืชื.
ืืืื ืืืืื.
ืืืืจ ืืชืงื ืช Papa, ืืืกืฃ use_papa=true ืืชืืืืืื ืืืฉืงืขืื ืืงืจืืืืื ืฉืื.
ืืืจื ืืื ืืชื ืจืืฆื ืืืืกื ืืช ืื ืืชืืืืืื ืฉื ืืืืกื ืืช ืฉืื ื-Papa, ืืืฃ ืืื ืืื
ืงืจืงืก ืชืืืืื ืืชืืืืืื ืืื ืืชืืกืคืื ืืคืืคืื ืืกืืืืกืืืงืืช.
[ืงืจืงืก]
loglevel = ืืืืข
[watcher:nginx]
cmd = /usr/local/nginx/sbin/nginx -p /Users/scottmax/Source/service-framework/Common/conf/nginx -c /Users/scottmax/Source/service-framework/Common/conf/nginx/nginx .conf
delay_warmup = 3
ืคืกืง ืืื ืืื ื ื = 10
max_retry = 5
ืืืื = ื ืืื
send_hup = ื ืืื
stop_signal = QUIT
stdout_stream.class = FileStream
stdout_stream.filename = /var/logs/web-server.log
stdout_stream.max_bytes = 10000000
stdout_stream.backup_count = 10
stderr_stream.class = FileStream
stderr_stream.filename = /var/logs/web-server-error.log
stderr_stream.max_bytes = 1000000
stderr_stream.backup_count = 10
ืคืขืื = ื ืืื
use_papa = ื ืืื
[watcher:logger]
cmd = /my_service/env/bin/python logger.py ืืคืขืื
working_dir = /my_service
ืคืกืง ืืื ืืื ื ื = 10
ืืืื = ื ืืื
stop_signal = INT
stdout_stream.class = FileStream
stdout_stream.filename = /var/logs/logger.log
stdout_stream.max_bytes = 10000000
stdout_stream.backup_count = 10
stderr_stream.class = FileStream
stderr_stream.filename = /var/logs/logger.log
stderr_stream.max_bytes = 1000000
stderr_stream.backup_count = 10
ืขืืืคืืช = 50
use_papa = ื ืืื
[watcher:web_app]
cmd = /my_service/env/bin/uwsgi --ini uwsgi-live.ini --socket fd://$(circus.sockets.web) --stats 127.0.0.1:809$(circus.wid)
working_dir = /my_service/web_app
graceful_timeout=10
stop_signal = QUIT
use_sockets = ื ืืื
stdout_stream.class = FileStream
stdout_stream.filename = /var/logs/web_app.log
stdout_stream.max_bytes = 10000000
stdout_stream.backup_count = 10
stderr_stream.class = FileStream
stderr_stream.filename = /var/logs/web_app.log
stderr_stream.max_bytes = 1000000
stderr_stream.backup_count = 10
hooks.after_spawn = examples.uwsgi_lossless_reload.children_started
hooks.before_signal = examples.uwsgi_lossless_reload.clean_stop
hooks.extended_stats = examples.uwsgi_lossless_reload.extended_stats
ืขืืืคืืช = 40
use_papa = ื ืืื
[socket:web]
ื ืชืื = /my_service/sock/uwsgi
use_papa = ื ืืื
[plugin:flapping]
use = circus.plugins.flapping.flapping
ืืืื = 10
ืขืืืคืืช = 1000
ืืขืจื:
ืื ืชืืืืื ืืคืืคื ืืฉืชืืฉืื ืืฉืงืขืื ืืืฉืื, ืฉืงืขืื ืืื ืืืืืื ืืืฉืชืืฉ ืื ืืคืืคื.
ืขืืฆืื ืืืจื
Papa ืชืืื ื ืืืืืช ืืืื ืืื ืืืืืกืื ืืชืืื ืืช ืืืืจืืฉืืช. ืื ืขืืฉื:
ยท ืฉืงืขื ืืคืขืื ืืขืฆืืจื
ยท ืืกืคืง ืื ืืช ืืคืชื/ืขืจื
ยท ืืชืื ืชืืืืืื ืืืืืจ ืืช stdout, stderr ืืงืื ืืืฆืืื
ืื ืื:
ยท ืืคืขื ืืืืฉ ืชืืืืืื
ยท ืืกืคืง ืืจื ืืขืฆืืจ ืชืืืืืื
ยท ืืกืคืง ืื ืืืืข ืขื ืชืืืืืื ืืืื ืืื ืื ืขืืืื ืคืืขืืื ืื ืื
Papa ืืื ื ืืืจืฉ ืกืคืจืืืช ืฉื ืฆื ืฉืืืฉื ืื ืฉืืื ืืืื ืืคืขืื ืจืง ืขื ืกืคืจืืืช Python ืืกืื ืืจืืืช.
ืื ืืืื ืืขืฉืืช ืฉืืืืฉ ื setproctitle ืืืืื ืืื ืื ืืฉืืฉ ืจืง ืืืื ืช ืืืืชืจืช
ืืคื ืืืชืจ ืขืืืจ ps ื ืืืง ืขืืืื ืืืื ื ืืืื ื.
ืืคืื ืงืฆืืื ืืืืช ื ืฉืืจื ืืืื ืืืื ืื ืฉืืขืืื ืื ืชืฆืืจื ืืืคืขืื ืืืืฉ ืืช
ืืืื ืืื. ืืื ืืืคืื ืงืฆืืื ืืืืช ื ืืืงื ืืกืคืจืืืช ืืืงืื
ืืคืฉืจื. ืื ืืชื ืืืืจ ืืืืืช ืืกืืื ืืคืจืืก ืขืืชืง ืืืฉ ืฉื Papa ืขืืืจ ืชืืื ืืช ืืงืื ืืืฉืืช
ืืื ืฆืืจื ืืืคืขืื ืืืืฉ ืืช ืืืื ืคืืคื. ืืื ื ืืขื ืืืืืช ืขืืื ืชืืื ืฉื ืืฆืืืืช ื
ืื ืืฉืชื ื ืฉื ืกืคืจืืืช ืฆื ืฉืืืฉื.
ืคืขืืื
ืจืื ืืืืจืื ื ืฉืืจืื ืืื ืฉืื ืื ืืื ืื ืืชื ืืฉืชืืฉ ื-Papa ืืืื ืื ืื. ืืชื ืขืืืื ืืืื ืืืชืืื ืืืขืฆืืจ
ืชืืืืืื. ืืชื ืขืืืื ืืืื ืืงืื ืกืืืืก ืืกืืืืกืืืงื ืขืืืจ ืชืืืืืื. ืืขืืงืจ ืฉืืฉืชื ื
ืื ืืืฉืจ ืืชื ืขืืฉื circusctl ืืืคืกืืง, ืื ืชืืืืื ืืคืืคื ื ืืชืจื ืคืืขืืื. ืืืฉืจ ืืชื
ืืชืืื ืงืจืงืก ืืืืื, ืชืืืืืื ืืื ืืฉืืืืจืื.
ืืขืจื:
ืืืฉืจ ืชืืืืืื ืืชืืืฉืฉืื, ืืคื ื_ืืชืื ื before_spawn ืืืื ืืืืืื.
ืจืืฉืื
ืืืื ืฉืกืืจืงืืก ืืืฉืืช, ืคืืคื ืืืืกื ืขื 2 ืืืืืื ืคืื ืืื ืชืืืื. ืืื ืื ืืืื
ืืืชืืื ืืืจืืง ืืช ืื ืชืื ืื ืืืฉื ืื ืืืืชืจ. ืืืฉืจ ืืชื ืืคืขืื ืืืืฉ ืืช Circus, ืืคืื ืืืืืืกื ืืืืืื ืื ืืืื ืืืืืจืืช
ืืืืืจ ืื ืฉืื ืืืจืื ืืคืื. ืืื ืืืจืฉ ืฉืงืืืช ืืคืื ืชืืื
ืืืืฉืจืช, ืื ืืชื ืื ืืืืจ ืืืื ืฉืื ืคืื ืืืืื ืืืืื.
ืื ืจืง ืื, ืืื ืคืืคื ืฉืืืจ ืืช ืืืชืืช ืืืื ืฉื ืืคืื. ืงืจืงืก ืืืืืจ ื
ื ืฆื ืืช ื ืชืื ื ืืืชืืช ืืืื ืื ืงืืืืื. ืื ืื ืืชื ืืืชื ืืช ืืคืื ืืงืืืฆื ืืืื
ืื ืืืคืฉืื, ืืืชืืืช ืืืื ืฉืื ืฆืจืืืืช ืืืืืช ื ืืื ืืช.
ืืขืืืช
ืื ืืชื ืืฉืชืืฉ ืชืืกืคืช or decr ืคืงืืื ืืฉื ืืช ืืช ืกืคืืจืช ืืชืืืื ืขืืืจ ืฆืืคื, ืื ืืขืฉื
ืืืคืก ืืจืื ืืืฆืืื ืช ืืงืืืฅ INI ืืืฉืจ ืงืจืงืก ืืืคืขื ืืืืฉ.
ืืื ืื, ืืืืืชื ืืขืืืช ืขื ืืฉืืืื ืฉื copy_env ื ืืืจืืืืื. ืืืชืื
ืฉืื ืื ืฉืืืืืช ื-INI ืืขืื ืขืืงืคืช ืืขืื ืื ืขื ื ืชืืืื ืืคืืจืฉืื.
Telnet ืึดืึฐืฉืึธืง
ื-Papa ืืฉ ืืืฉืง ืฉืืจืช ืคืงืืื ืืกืืกื ืฉืืืื ืืชื ืืืื ืืืฉืช ืืจื telnet:
20202
ืืขืืืจ
ืงืจืงืก ื ืืคืชืืื
ืฉืืืืฉ ืงืจืงืก as a ืกืคืจืื
Circus ืืกืคืง ืฉืืขืืจืื ืืคืื ืงืฆืืืช ืืจืื ืืืืื ืฉืืืคืฉืจื ืื ืื ืื ืชืืืืืื ืคื ืืื
ืืืืฉืืืื ืฉืื.
ืืืืืื, ืื ืืชื ืจืืฆื ืืืคืขืื ืืจืืขื ืชืืืืืื ืื ืฆื, ืชืืื ืืืชืื:
ื-Circus import get_arbiter
myprogram = {"cmd": "python myprogram.py", "numprocesses": 4}
arbiter = get_arbiter([ืืชืืื ืืช ืฉืื])
ื ืกื:
arbiter.start()
ืกืืฃ ืกืืฃ:
arbiter.stop()
ืงืืข ืื ืืคืขืื ืืจืืขื ืืืคืขืื ืฉื ืืชืืื ืืช ืฉืื ืืืฆืคืืช ืืื ืืฉืืืื, ืืืคืขืื ืืืชื ืืืืฉ
ืื ืื ืืืืชื ืืืคืชืืข.
ืืืืืข ื ืืกืฃ ืขื ืื, ืจืื ืกืคืจืื
ืืืจืื ืงืจืงืก
ืงื ืืืจืืื ืืช Circus ืืื ืืืฆืืจ ืืขืจืืช ืืืจืืืช ืืืชืจ, ืขื ืืื ืืืื ื ืืื
ืงืจืงืก ืืืจืืขืื ืืจื ืืคืื/ืขืจืืฅ ืืืฉื ื ืฉืื, ืืื ืขืช ืืืชื ืืืืฆืขืืช ืคืงืืืืช.
ืื ืคืืขืืช ืชืืื ืช ืืืชื ืืคืคืืช ืืืฉื: ืืื ืืงืฉืืื ืืื ืืชืืืืืื ืืืกืกืื,
ืืืื ืืืืื ืชืืืจืืช ืื ืงืืจื, ืืขืืฆืจ ืืช ืืฆืืคืื ืืืืคืืืื ืืืืจ ืืืชืจ ืืื ืืคืขืื ืืืืฉ
ื ืืกืืื ืืช.
Circus ืืืืข ืขื ืืขืจืืช ืชืืกืคืื ืฉืชืขืืืจ ืื ืืืชืื ืืจืืืืช ืืืื, ืืืื ืืืื ืืช
ืชืืกืคืื ืฉืืชื ืืืื ืืขืฉืืช ืืื ืฉืืืืฉ ืืืืจ. ืจืื ืชืืกืคืื.
ืืชื ืืืื ืื ืืงืื ืืชื ืืืืช ืืคืขืื ืืืืืื ืขืืื ื ืืืชืจ ืขื ืืื ืฉืืืืฉ ื- ืืืื ืืขืจืืช
ืฉืืืคืฉืจ ืื ืืืจืืฅ ืงืื ืฉืจืืจืืชื ืืคื ื ืืืืจื ืืื ืชืืืืืื ืืืคืขืืื ืื
ืขืฆืจ. ืจืื ืืืื.
ืืืจืื ืืืื, ืืชื ืืืื ืื ืืืืกืืฃ ืคืงืืืืช ืืืฉืืช. ืจืื ืืืกืคืช cmds.
ืืคืชืืื ืชืืขืื ืืื
ืงืจืงืก ืกึดืคึฐืจึดืึธื
ืืืืืช ืืงืจืงืก ืืืจืืืช ืืจืื ืืืืื get_arbiter() ืคืื ืงืฆืื ืืฉืืขืืจืื ืจืืื. ื
ืืจืื ืืืงืจืื, ืืฉืืืืฉ ืืคืื ืงืฆืื ืืจืื ืืืืื ืืืืจ ืืืกืคืืง, ืืืืืื ืฉืืื ืืืฆืจ ืืช ืื ืื
ืืจืืฉ ืืงืจืงืก ืืจืืฅ.
ืืชื ืืืื ืืชืช ืืืชื ืืฉืืขืืจืื ืฉื Circus ืื ืืชื ืฆืจืื ืคืืจืื ืจื ืืืชืจ ืืื ืฉืืฆืืข
ืชืฆืืจื.
ืืฉืืืื ืงืื_ืืืจืจ ืคืื ืงืฆืื
get_arbiter() ืืื ืจืง ื ืืืืช ืขื ืืื ืฉืืขืืจื ืืงืจืงืก ืืฉืื ืื. ืื ืืืฆืจ ื
ืคืืกืง (ืืขืื ืฉืืืจ) ืืืคืข ืขื ืืืคืฉืจืืืืช ืฉืกืืคืงื, ืืฉืจ ืืชืืจื ืืจืืฅ ืกืื ืื
ืฆืืคื ืขื ืกืื ืื ืืชึทืึฒืึดืื.
circus.get_arbiter()
ืืืืื:
ื-Circus import get_arbiter
arbiter = get_arbiter([{"cmd": "myprogram", "numprocesses": 3}])
ื ืกื:
arbiter.start()
ืกืืฃ ืกืืฃ:
arbiter.stop()
ืืืืื
Circus ืืกืคืงืช ืกืืจื ืฉื ืฉืืขืืจืื ืฉืืื ืชืืื ืืืฉืชืืฉ ืืื ืืืืฉื ืืช ืื ืื ืืชืืืื ืฉืื:
ยท ืืชึทืึฒืึดืื: ืขืืืฃ ืชืืืื ืจืฅ ืืืกืคืง ืืื ืขืืืจืื ืขื ืืืื.
ยท ืฆืืคื: ืืคืขื ืืกืคืจ ืืืคืขืื ืฉื ืืชึทืึฒืึดืื ื ืื ืืืชื ืคืงืืื. ื ืื ืืช ืืืืืช ื
ืืืื ืฉื ืชืืืืืื.
ยท ืฉืืืจ: ืื ืื ืืื ืฆืืคื.
ืืืืชื circus.process.Process(name, wid, cmd, args=ืืื, working_dir=ืืื, ืืขืืคืช=ืฉืงืจ,
uid=ืืื, gid=ืืื, env=ืืื, rlimits=ืืื, ืืคืขืื=ืืื, use_fds=ืฉืงืจ, ืฆืืคื=ืืื,
spawn=ื ืืื, pipe_stdout=ื ืืื, pipe_stderr=ื ืืื, close_child_stdout=ืฉืงืจ,
close_child_stderr=False)
ืขืืืฃ ืชืืืื.
ืืคืฉืจืืืืช:
ยท wid: ืืืืื ืืืืืืื ืฉื ืืชืืืื. ืขืจื ืื ืืฉืืฉ ืืื ืืืืืืฃ ืืช $WID
ืืืจืืืช ืืฉืืจืช ืืคืงืืื ืื ืงืืืืช.
ยท cmd: ืืคืงืืื ืืืคืขืื. ืขืฉืื ืืืืื ืื ืืื ืืืืฉืชื ืื ืืืืื ืื ืฉืื
ืืืขืืจ ืืืืชื ืื. ืื ืืืืืคื ืืืืฆืขืืช ืชืืืืจ ืคืืจืื python.
ยท ืืืขื: ืืืจืืืื ืืื ืืืคืขืืช ืืคืงืืื. ืืืืื ืืืืืช ืจืฉืืื ืื ืืืจืืืช. ืื ืืืขื is
ืืืจืืืช, ืืื ืืคืืฆืืช ืืืืฆืขืืช shlex.split (). ืืจืืจืช ืืืืื ืืื ืืื.
ยท ืืคืขืื: ืืืฉืจ ื ืืชื ืงืืืฅ ืืคืขืื, ืืคืจืื ืืจืืฉืื ืืจืฆืฃ args
ืืืฉื ื cmd ืขืืืื ืืชืืืืกืื ืืจืื ืืชืืื ืืืช ืืฉื ืืคืงืืื, ืืฉืจ
ืืืืจ ืืื ืืืื ืืืืืช ืฉืื ื ืืฉื ืืืคืขืื ืืคืืขื. ืื ืืืคื ืืชืฆืืื
ืฉื ืืชืืื ืืช ืืืืฆืขืช ืืืื ืฉืืจืืช ืืืื ps.
ยท working_dir: ืกืคืจืืืช ืืขืืืื ืฉืื ืืฉ ืืืคืขืื ืืช ืืคืงืืื. ืื ืื ืืกืืคืง, ืืืื
ืืจืืจืช ืืืืื ืืกืคืจืืืช ืืขืืืื ืื ืืืืืช.
ยท ืคึผึธืึธื: ืื ื ึธืืึนื, ืืจืืฅ ืืช ืืคืงืืื ืืกืืืืช ืืืขืืคืช. ืื ื ืืื ืืืจืืจืช ืืืื.
ืึทืืึธืจึธื: ืึถื is a ืืืืื ืกืื ื.
ยท uid: ืื ื ืืชื, ืืื ืืืื ืืืฉืชืืฉ ืื ืืฉื ืฉืืืชื ืืคืงืืื ืฆืจืืื ืืคืขืื. ืื ืืืื
uid ืืื ืืจืืจืช ืืืืื.
ยท gid: ืื ื ืืชื, ืืื ืืืื ืืงืืืฆื ืื ืืฉื ืฉืืืชื ืืคืงืืื ืฆืจืืื ืืคืขืื. ืื ืืืื
gid ืืื ืืจืืจืช ืืืืื.
ยท env: ืืืคืื ืืืืื ืืช ืืฉืชื ื ืืกืืืื ืืืชื ืชืคืขื ืืคืงืืื.
ืืืคืฆืืื ืื
ยท rlimits: ืืืคืื ืืืืื ืฉืืืช ืืขืจืืื ืฉื rlimit ืฉืืืืืจื ืืคื ื ื-
ืืคืงืืื ืคืืขืืช.
ยท use_fds: ืื ื ืืื, ืื ืืกืืืจ ืืช ื-fds ืืชืืืื ืืืฉื ื. ืืฉ ืืืืืืจ ื
ื ืืื ื-Windows ืื stdout ืื stderr ืื ืืชืืื ืืืืฉ. ืืจืืจืช ืืืื: False.
ยท pipe_stdout: ืื ื ืืื, ืืคืชื PIPE ืขื stdout. ืืจืืจืช ืืืื: ื ืืื.
ยท pipe_stderr: ืื ื ืืื, ืืคืชื PIPE ืขื stderr. ืืจืืจืช ืืืื: ื ืืื.
ยท close_child_stdout: ืื ื ืืื, ืืคื ื ืืืืฉ ืืช ื-stdout ืฉื ืชืืืื ืืืื ืื /dev/null
ืืืจื ืืืืื. ืืจืืจืช ืืืื: False.
ยท close_child_stderr: ืื ื ืืื, ืืคื ื ืืืืฉ ืืช ื-stdout ืฉื ืชืืืื ืืืื ืื /dev/null
ืืืจื ืืืืื. ืืจืืจืช ืืืื: False.
ืืื() ืืืืจ ืืช ืืื ืืชืืืื ืืฉื ืืืช.
ืึฐืึธืึดืื()
ืืืืจ ืจืฉืืื ืฉื ืืืืื ืืืืื.
ืืืืข () ืืืืจืช ืืืืข ืขื ืชืืืื.
ืืืืืข ืืืืืืจ ืืื ืืืคืื ืขื ืืืคืชืืืช ืืืืื:
ยท mem_info1: ืืืืจืื ืืืื ืชืืฉื ืืืชืื (RSS)
ยท mem_info2: ืืืื ืืืืจืื ืืืจืืืืื ืืืชืื (VMS).
ยท ืืขืื:% ืืืฉืืืืฉ ืืืขืื.
ยท ื: % ืืฉืืืืฉ ืืืืืจืื.
ยท ืืื: ืืื ืขืืืื ืืขืื (ืืฉืชืืฉ + ืืขืจืืช) ืืฉื ืืืช.
ยท PID: ืืืื ืชืืืื.
ยท ืฉื ืืฉืชืืฉ: ืฉื ืืฉืชืืฉ ืฉืืื ืืืขืืื ืฉื ืืชืืืื.
ยท ื ืืื: ื ืืืืืช ืืชืืืื (ืืื -20 ื-20)
ยท ืงื ืก"ื: ืฉืืจืช ืืคืงืืื ืืืชื ืืชื ืื ืืชืืืื.
is_child(pid)
ืืืืจ ื ืืื ืืื ืื ืชืื PID ืืื ืืื ืฉื ืืชืืืื ืืื.
PID ืืืืืืจ ืืช PID
send_signal(*args, ** ืงืืืืืื)
ืฉืืื ืืืช sig ืืชืืืื.
send_signal_child(*args, ** ืงืืืืืื)
ืฉืื ืืืช ืืชืืื ืืืื PID.
send_signal_children(*args, ** ืงืืืืืื)
ืฉืื ืืืช ืืชืืื ืืื ืืืืืื.
ืืฆื ืืืืจ ืืช ืืฆื ืืชืืืื ืืงืืืข
ยท ืจืฅ
ยท DEAD_OR_ZOMBIE
ยท ืื ืงืืื
ยท ืืืจ
ืกืืืจืจ ืืืืืืจ ืืช stdout ืืจื
stdout ืืืืืืจ ืืช stdout ืืจื
ืขืฆืืจ(*ืืจืืก, ** ืงืืืืืื)
ืขืฆืืจ ืืช ืืชืืืื ืืกืืืจ ืืช stdout/stderr
ืื ืืชืืืื ืืืชืืื ืขืืืื ืืื (ืืืจื ืืื ืืื ืืืจ ื ืืจื ืขื ืืื
ืืฆืืคื), ื ืฉืื SIGTERM, ืืื SIGKILL ืืืืจ ืฉื ืืื ืืืช.
ืชืืืื ืืืืืื (SIGTERM ืืื SIGKILL) ืืชืืฆืข ืืืจื ืืื ืขื ืืื
ืฆืึนืคึถื. ืื ืื ืืชืืืื ืขืืืื ืฉื, ืื ืกืื ืฉื ืืชื ืืืืช ืจืขื
ืื ืคืกืง ืืืื ืืืื ื ื ืื ืืืื ืืื.
ืืืืื:
>>> ืืชืื ืชืืืื ืืืืื โโcircus.process
>>> process = Process('Top', 'top', shell=True)
>>> process.age()
3.0107998847961426
>>> process.info()
'ืืืขืื: 6812 N/A tarek Zombie N/AN/AN/AN/AN/A'
>>> process.status
1
>>> process.stop()
>>> process.status
2
>>> process.info()
'ืืื ืชืืืื ืืื (ื ืขืฆืจ?)'
ืืืืชื circus.watcher.Watcher(ืฉื, cmd, args=ืืื, numprocesses=1, warmup_delay=0.0,
working_dir=ืืื, ืืขืืคืช=ืฉืงืจ, shell_args=ืืื, uid=ืืื, max_retry=5, gid=ืืื,
send_hup=ืฉืงืจ, stop_signal=15, stop_children=ืฉืงืจ, env=ืืื, graceful_timeout=30.0,
prereload_fn=ืืื, rlimits=ืืื, ืืคืขืื=ืืื, stdout_stream=ืืื, stderr_stream=ืืื,
priority=0, ืืืืื=ืืื, singleton=ืฉืงืจ, use_sockets=ืฉืงืจ, copy_env=ืฉืงืจ,
copy_path=ืฉืงืจ, max_age=0, max_age_variance=30, ืืืื=ืืื, respawn=ื ืืื, autostart=ื ืืื,
on_demand=ืฉืงืจ, virtualenv=ืืื, close_child_stdout=ืฉืงืจ, close_child_stderr=ืฉืงืจ,
virtualenv_py_ver=ืืื, use_papa=ืฉืงืจ, **ืืคืฉืจืืืืช)
ืืืชื ื ืืืื ืจืฉืืื ืฉื ืชืืืืืื ืขืืืจ ืคืงืืื ื ืชืื ื.
ืืคืฉืจืืืืช:
ยท ืฉื: ืฉื ืฉื ืืชื ืืฆืืคื. ืืฉืืฉ ืืืืืื ืืืืืื.
ยท cmd: ืืคืงืืื ืืืคืขืื. ืขืฉืื ืืืืื $WID, ืืฉืจ ืืืืืฃ ื wid.
ยท ืืืขื: ืืืจืืืื ืืื ืืืคืขืืช ืืคืงืืื. ืืืืื ืืืืืช ืจืฉืืื ืื ืืืจืืืช. ืื ืืืขื is
ืืืจืืืช, ืืื ืืคืืฆืืช ืืืืฆืขืืช shlex.split (). ืืจืืจืช ืืืืื ืืื ืืื.
ยท ืืกืคืจ ืชืืืืืื: ืืกืคืจ ืืชืืืืืื ืืืคืขืื.
ยท working_dir: ืกืคืจืืืช ืืขืืืื ืฉืื ืืฉ ืืืคืขืื ืืช ืืคืงืืื. ืื ืื ืืกืืคืง, ืืืื
ืืจืืจืช ืืืืื ืืกืคืจืืืช ืืขืืืื ืื ืืืืืช.
ยท ืคึผึธืึธื: ืื ื ึธืืึนื, ืืจืืฅ ืืช ืืคืงืืื ืืกืืืืช ืืืขืืคืช. ืื ื ืืื ืืืจืืจืช ืืืื.
ืึทืืึธืจึธื: ืึถื is a ืืืืื ืกืื ื.
ยท uid: ืื ื ืืชื, ืืื ืืืื ืืืฉืชืืฉ ืื ืืฉื ืฉืืืชื ืืคืงืืื ืฆืจืืื ืืคืขืื. ืื ืืืื
uid ืืื ืืจืืจืช ืืืืื.
ยท gid: ืื ื ืืชื, ืืื ืืืื ืืงืืืฆื ืื ืืฉื ืฉืืืชื ืืคืงืืื ืฆืจืืื ืืคืขืื. ืื ืืืื
gid ืืื ืืจืืจืช ืืืืื.
ยท ืฉืื_ืืค: ืื ื ืืื, ืืขืื ืช ืชืืืื ืืืืฉ ืชืชืืฆืข ืขื ืืื ืฉืืืืช ืืืืช SIGHUP.
ืืจืืจืช ืืืืื ื-False.
ยท ืืืช_ืขืฆืืจื: ืืืืช ืฉืืฉ ืืฉืืื ืืขืช ืขืฆืืจืช ืืชืืืื. ืืจืืจืช ืืืืื ืืื SIGTERM.
ยท ืขืฆืืจ_ืืืืื: ืฉืื ืืช ื ืืืช_ืขืฆืืจื ืื ืืืืืื. ืืจืืจืช ืืืืื ื-False.
ยท env: ืืืคืื ืืืืื ืืช ืืฉืชื ื ืืกืืืื ืืืชื ืชืคืขื ืืคืงืืื.
ืืืคืฆืืื ืื
ยท rlimits: ืืืคืื ืืืืื ืฉืืืช ืืขืจืืื ืฉื rlimit ืฉืืืืืจื ืืคื ื ื-
ืืคืงืืื ืคืืขืืช.
ยท stdout_stream: ืืืคืื ืฉืืืืืจ ืืช ืืืจื ืขืืืจ ื-proces stdout. ืืจืืจืืช ืืืื
ื-None.
ืืืคืฆืืื ืืื. ืืืฉืจ ืืกืืคืง, stdout_stream ืืื ืืืคืื ืืืืื ืขื ืฉืืืฉื ืืคืชืืืช:
ยท ืืืืชื: ืืืชืช ืื ืื. ืืจืืจืช ืืืื ื circus.stream.FileStream
ยท ืฉื ืืงืืืฅ: ืฉื ืืงืืืฅ, ืื ืืฉืชืืฉืื ื-FileStream
ยท max_bytes: ืืืื ืงืืืฅ ืืงืกืืืื, ืฉืืืืจืื ื ืคืชื ืงืืืฅ ืคืื ืืืฉ. ืืจืืจืืช ืืืื
ื-0 ืืืืืจ ืืื ืืืื ืืงืกืืืื (ืืชืืื ืจืง ืขื FileStream).
ยท ืืืืื_ืกืคืืจืช: ืืื ืืืืืืื ืืฉืืืจ ืืขืช ืกืืืื ืงืืฆืื ืืคื ื
ืคืจืืืจ max_bytes. ืืจืืจืช ืืืืื ืืื 0 ืื ืฉืืืืจ ืฉืื ืืชืืฆืขืื ืืืืืืื (ืจืง
ืืฉืื ืขื FileStream)
ืืืคืื ืื ืืฉืืฉ ืืืฆืืจืช ืืจื ืื ืืชื ืืืชืงืฉืจืืช ืฉื ืืืืืงื ืฉืฆืืื ื.
ืื ืขืจื ืฉืืชืงืื ืขื ืืื ืื ืืชื ืืืชืงืฉืจืืช ืืื ืืืคืื ืืืืื:
ยท PID - ืชืืืื pid
ยท ืฉื - ืฉื ืืืจื (ืกืืืจืจ or stdout)
ยท ื ืชืื ืื - ืื ืชืื ืื
ืื ืื ื ืชืื ื-Windows.
ยท stderr_stream: ืืืคืื ืฉืืืืืจ ืืช ืืืจื ืขืืืจ ืชืืืื stderr. ืืจืืจืืช ืืืื
ื-None.
ืืืคืฆืืื ืืื. ืืืฉืจ ืืกืืคืง, stderr_stream ืืื ืืืคืื ืืืืื ืขื ืฉืืืฉื ืืคืชืืืช:
- ืืืืชื: ืืืชืช ืื ืื. ืืจืืจืช ืืืื ื circus.stream.FileStream - ืฉื ืืงืืืฅ: ื
ืฉื ืงืืืฅ, ืื ืืฉืชืืฉืื ื- FileStream - max_bytes: ืืืื ืงืืืฅ ืืงืกืืืื, ืืืืืจ ืืื ืืืฉ
ืงืืืฅ ืืคืื ืืื
ื ืคืชื. ืืจืืจืช ืืืืื ืืื 0, ืืืืืจ ืืื ืืืื ืืงืกืืืื (ืืชืืื ืจืง ืขื
FileStream)
ยท ืืืืื_ืกืคืืจืช: ืืื ืืืืืืื ืืฉืืืจ ืืขืช ืกืืืื ืงืืฆืื ืืคื ื
ืคืจืืืจ max_bytes. ืืจืืจืช ืืืืื ืืื 0 ืื ืฉืืืืจ ืฉืื ืืชืืฆืขืื ืืืืืืื (ืจืง
ืืฉืื ืขื FileStream).
ืืืคืื ืื ืืฉืืฉ ืืืฆืืจืช ืืจื ืื ืืชื ืืืชืงืฉืจืืช ืฉื ืืืืืงื ืฉืฆืืื ื.
ืื ืขืจื ืฉืืชืงืื ืขื ืืื ืื ืืชื ืืืชืงืฉืจืืช ืืื ืืืคืื ืืืืื:
ยท PID - ืชืืืื pid
ยท ืฉื - ืฉื ืืืจื (ืกืืืจืจ or stdout)
ยท ื ืชืื ืื - ืื ืชืื ืื
ืื ืื ื ืชืื ื-Windows.
ยท ืขืืืคืืช -- ืืกืคืจ ืฉืื ืืืืืืจ ืขืืืคืืช ืขืืืจ ืืฆืืคื. ืืฉืืืืจืจ ืืขืฉื ืืืช
ืืื ืคืขืืืืช ืขื ืื ืืฆืืคืื, ืื ืืืืื ืืืชื ืขื ืืฉืื ืืื, ืื
ืืกืคืจ ืืืื ืืืชืจ ืืงืื ืืืืชืจ. (ืืจืืจืช ืืืื: 0)
ยท ืงึฐืึธืฃ ืึผืึนืึตื -- ืื ื ืืื, ืืฆืืคื ืืื ืืฉ ืชืืืื ืืืื. (ืืจืืจืช ืืืื: False)
ยท use_sockets -- ืื ื ืืื, ืืชืืืืืื ืืืจืฉื ืืช ืืชืืจื ืืงืืฆืื, ืืืื ืืืืืื
ืืขืฉืืช ืฉืืืืฉ ืืืืจ ืืฉืงืขืื ืฉื ืคืชืื ืขื ืืื circusd. (ืืจืืจืช ืืืื: False)
ยท ืืคื ืืจืืฉื -- ืื ื ืืื, ืืชืืืืืื ืืืคืขืื ืจืง ืืืืืืจ ืืจืืฉืื
ืืฉืงืข (ืืจืืจืช ืืืื: False)
ยท copy_env -- ืื ื ืืื, ืืกืืืื ืฉืื ืืชื ืื ืืงืจืงืก ืชืืื
ืืฉืืืคื ืขืืืจ ืืขืืืืื. ืืจืืจืช ืืืืื ืืื True ื-Windows ืืืืืื ืฉืืื ื ืืืื ืืืคืขืื
ืื ืงืืืฅ ืืคืขืื ืืื SYSTEMROOT ืึดืฉืึฐืชึทื ึถื. (ืืจืืจืช ืืืื: False)
ยท copy_path - ืื ืื ื ืืื, ืงืจืงืก sys.path ื ืฉืื ืืชืืืื ืืจื PYTHONPATH.
ืขืืื ืืืคืขืื copy_env ื copy_path ืืขืืื. (ืืจืืจืช ืืืื: False)
ยท max_age: ืื ืืืืืจ ืืืืจ ืืกืืืืืช max_age seconds, ืืชืืืื ืืืืืฃ ืืืืฉ
ืืื. (ืืจืืจืช ืืืื: 0, ืืืฉืืช)
ยท max_age_variance: ืืืกืคืจ ืืืจืื ืฉื ืฉื ืืืช ืฉื ืืชื ืืืืกืืฃ ื-max_age.
ืขืจื ื ืืกืฃ ืื ื ืืขื ืืืืื ืข ืืืคืขืื ืืืืฉ ืฉื ืื ืืชืืืืืื ืื-ืืื ืืช. ื
ืืชืืืื ืืชืงืืื ืืื max_age ืืืื max_age + max_age_variance ืฉื ืืืช.
ยท ืืืื: ืคืื ืงืฆืืืช ืืชืงืฉืจืืช ืืืืจืช ืืืืืืจ ืืืคืขืื ืืืืืื ืฉื ืืฆืืคื
ืืชืืืื. ืืืื ืืื dict ืฉืื ืื ืืคืชื ืืื ืฉื ืืื ืืื ืขืจื ืืื a
2-tuple ืขื ืืฉื ืฉื ืื ืืชื ืืืชืงืฉืจืืช ืื ืื ืงืจื ืขืฆืื ืืืื ืืืืืื ื
ืืืฆืืื ืื ืืื ืืืชืขืื ืืืจืื ืืืชืจืืฉ ื-hook. ืืคืฉืจื
ืขืจืืื ืขืืืจ ืฉื ืืื: ืืคื ื_ืืชืื, after_start, before_spawn, after_spawn,
ืืคื ื_ืขืฆืืจ, after_stop., ืืคื ื_ืืืช, ืืืจื_ืืืช or ืกืืืืกืืืงืืช_ืืืจืืืืช.
ยท ืืคืฉืจืืืืช -- ืืคืฉืจืืืืช ื ืืกืคืืช ืขืืืจ ืืขืืื. ืื ืืืคืฉืจืืืืช ื ืืฆืืืช ืืชืฆืืจื
ืืืฉื, ืืืขืืจืื ืืืืคืื ืื -- ืื ืืืื ืืฉืืฉ ืชืืกืคืื ืขืืืจ
ืืคืฉืจืืืืช ืกืคืฆืืคืืืช ืืฆืืคื.
ยท respawn -- ืื ืืืืืจ ื-false, ืืชืืืืืื ืืืืืคืืื ืขื ืืื ืฆืืคื ืื ืืืื
ืืืคืฅ ืืืืฉ ืืืืคื ืืืืืืื. (ืืจืืจืช ืืืื: ื ืืื)
ยท ืืืจืืืืื -- ืกืคืจืืืช ืืฉืืจืฉ ืฉื virtualenv. ืื ืืกืืคืง, ืืฆืืคื ืืขืฉื ืืืช
ืืืขืืืก ืืช ืืกืืืื ืืืืฆืืขื. (ืืจืืจืช ืืืื: ืืื)
ยท close_child_stdout: ืื ื ืืื, ืกืืืจ ืืช ื-stdout ืืืจื ืืืืื. ืืจืืจืช ืืืื: False.
ยท close_child_stderr: ืื ื ืืื, ืกืืืจ ืืช ืืกืืืจืจ ืืืจื ืืืืื. ืืจืืจืช ืืืื: False.
ยท use_papa: ืื ื ืืื, ืืฉืชืืฉ ืืืืืช ืชืืืื papa ืขืืืจ ืชืืืื ืื. ืืจืืจืช ืืืื: False.
kill_process(*args, **ืงืืืืจืืก)
ืชืืืื ืืจื (stop_signal, graceful_timeout ืืื SIGKILL)
kill_processes(*args, **ืงืืืืจืืก)
ืืจืื ืืช ืื ืืชืืืืืื (stop_signal, graceful_timeout ืืื SIGKILL)
manage_processes(*args, **ืงืืืืจืืก)
ื ืืืื ืชืืืืืื.
notify_event(ื ืืฉื, msg)
ืคืจืกื ืืืืขื ืืขืจืืฅ ืืคืจืกื ืืืืจืืข
reap_and_manage_processes(*args, **ืงืืืืจืืก)
ืงืฆืืจ ืื ืื ืชืืืืืื.
reap_processes(*args, ** ืงืืืืืื)
ืงืฆืืจ ืืช ืื ืืชืืืืืื ืขืืืจ ืืฆืืคื ืืื.
send_signal_child(*args, ** ืงืืืืืื)
ืฉืื ืืืช ืืืื.
spawn_process(recovery_wid=None)
ืชืืืื ืืฉืจืฆืื.
ืืืืจ True ืื ืืกืืจ, False ืื ืืฉ ืืขืฆืืจ ืืช ืืฆืืคื
spawn_processes(*args, **ืงืืืืจืืก)
ืชืืืืื ืืฉืจืฆืื.
ืืืืชื circus.arbiter.Arbiter(watchers, ื ืงืืืช ืงืฆื, pubsub_endpoint, check_delay=1.0,
prereload_fn=ืืื, context=ืืื, ืืืืื=ืืื, statsd=ืฉืงืจ, stats_endpoint=ืืื,
statsd_close_outputs=ืฉืงืจ, multicast_endpoint=ืืื, plugins=ืืื, ืฉืงืขืื=ืืื,
warmup_delay=0, httpd=ืฉืงืจ, httpd_host='localhost', httpd_port=8080,
httpd_close_outputs=ืฉืงืจ, debug=ืฉืงืจ, debug_gc=ืฉืงืจ, ssh_server=ืืื,
proc_name='circusd', pidfile=ืืื, loglevel=ืืื, logoutput=ืืื, loggerconfig=ืืื,
fqdn_prefix=ืืื, umask=ืืื, endpoint_owner=ืืื, papa_endpoint=ืืื)
ืืืืชื ืืฉืืฉืช ืืฉืืืื ืืจืฉืืืช ืฆืืคืื.
ืืคืฉืจืืืืช:
ยท ืฆืืคืื -- ืจืฉืืื ืฉื ืืืืืืงืืื ืฉื Watcher
ยท ื ืงืืืช ืกืืื -- ื ืงืืืช ืืงืฆื ืฉื ืืืงืจ ZMQ
ยท pubsub_endpoint -- ื ืงืืืช ืืงืฆื ืฉื pubsub
ยท ืกืืืืกืืืงื -- ืื ื ืืื, ืืืคืขื ืชืืืื circusd-stats (ืืจืืจืช ืืืื: False)
ยท stats_endpoint -- ื ืงืืืช ืืงืฆื ืืกืืืืกืืืช.
ยท statsd_close_outputs -- ืื True ืฉืืื ืืช circusd-stats stdout/stderr ืื
/dev/null (ืืจืืจืช ืืืื: False)
ยท multicast_endpoint -- ื ืงืืืช ืืกืืื ืฉื ืจืืืื ืฉืืืืจืื ืืืืืื ืืืืืืื ืฉื ืืฉืืื circusd
(ืืจืืจืช ืืืื: udp://237.219.251.97:12027) ืืชืืืช ืจืืืื ืฉืืืืจ ืฆืจืืื ืืืืืช ืืื 224.0.0.0
ื-239.255.255.255 ืืืื ืขืืืจ ืืฉืืื ืืื.
ยท check_delay -- ืืืฉืืื ืืื ืฉืชื ื ืงืืืืช ืืงืจื (ืืจืืจืช ืืืื: 1 ืฉื ืืืช)
ยท prereload_fn -- ื ืืชื ืืืชืงืฉืจืืช ืฉืืืืฆืข ืืื ืืขืื ื ืืืืฉ (ืืจืืจืช ืืืื: ืืื)
ยท ืืงืฉืจ -- ืื ืืกืืคืง, ืืืงืฉืจ ืฉื zmq ืืฉืืืืฉ ืืืืจ. (ืืจืืจืช ืืืื: ืืื)
ยท
ืืืืื: if ืืชื ืื, a zmq.eventloop.ioloop.IOLoop ืืืฉื
ืืขืฉืืช ืฉืืืืฉ ืืืืืฉ. (ืืจืืจืช ืืืื: ืืื)
ยท ืชืืกืคืื -- ืจืฉืืื ืฉื ืชืืกืคืื. ืื ืคืจืื ืืื ืืืคืื ืขื:
ยท ืืืฉืชืืฉ -- ืฉื ืืื ืืืฆืืืข ืขื ืืืืงืช ืืคืืืืื
ยท ืื ืขืจื ืืืจ ืืืขืืจ ืืคืืืืื ื- config ืืึนืคึผึฐืฆึดืึธื
ยท ืืจืืืืช -- ืืืคืื ืฉื ืฉืงืขืื. ืื ืืคืชื ืืื ืฉื ืืฉืงืข, ืืื ืขืจื a
CircusSocket ืืขืื. (ืืจืืจืช ืืืื: ืืื)
ยท ืขืืืื_ืืืืื - ืขืืืื ืืฉื ืืืช ืืื ืืคืขืื ืฉื ืฉื ื ืฆืืคืื. (ืืจืืจืช ืืืื: 0)
ยท httpd -- ืื ื ืืื, ืืืคืขื ืชืืืื circushttpd (ืืจืืจืช ืืืื: False)
ยท httpd_host -- ืืืืจื circushttpd (ืืจืืจืช ืืืื: localhost)
ยท httpd_port -- ื ืื circushttpd (ืืจืืจืช ืืืื: 8080)
ยท httpd_close_outputs -- ืื ื ืืื, ืฉืืื ืืช circushttpd stdout/stderr ืื /dev/null.
(ืืจืืจืช ืืืื: False)
ยท ืืืืื -- ืื ื ืืื, ืืืกืืฃ ืืืืข ืจื ืขื ื ืืคืื ืืืืื ื-stdout (ืืจืืจืช ืืืื: False)
ยท debug_gc -- ืื ื ืืื, ืืื gc.set_debug(gc.DEBUG_LEAK) (ืืจืืจืช ืืืื: False) ื-circusd
ืื ืชื ืืขืืืช (ืืจืืจืช ืืืื: False)
ยท proc_name -- ืฉื ืชืืืื ืืืืจืจ
ยท
fqdn_prefix -- a ืงืืืืืช ื ืื ืืื ืืืืืื ืืืื of ืื ืืื ืงืจืงืก
ืืืคืข ืขื ืืืฉืืื.
ยท endpoint_owner - ืืฉืชืืฉ ืืื ืืงืก ืืืืืจืช ื ืงืืืช ืืงืฆื ืื ืืฉืชืืฉืื ื-ipc.
ยท papa_endpoint -- ื ืงืืืช ืืกืืื ืฉื ืืืืช ืชืืืื Papa
add_watcher(*args, **ืงืืืืจืืก)
ืืืกืืฃ ืฆืืคื.
ืืคืฉืจืืืืช:
ยท ืฉื: ืฉื ืืฆืืคื ืืืืกืคื
ยท cmd: ืืคืงืืื ืืืคืขืื.
ยท ืื ืฉืืจ ืืืคืฉืจืืืืช ืืืืืืจืืช ืืื ืื Watcher.
get_watcher(ืฉื)
ืืืืจ ืืช ืืฆืืคื ืฉื.
numprocesses()
ืืืืจ ืืช ืืกืคืจ ืืชืืืืืื ืืคืืขืืื ืืื ืืฆืืคืื.
numwatchers()
ืืืืจ ืืช ืืกืคืจ ืืฆืืคืื.
ืืขื ืืืืฉ(*args, **ืงืืืืจืืก)
ืืืขื ืืื ืืืืฉ.
ืืคืขื ืืช prereload_fn() ื ืืชื ืืืชืงืฉืจ ืื ืืฉ, ืื ืืื ืืืืฉ ืืช ืื ืืฆืืคืื.
start(*args, **ืงืืืืจืืก)
ืืชืืื ืืช ืื ืืฆืืคืื.
ืื ื-ioloop ืกืืคืง ืืืืื ืืงืจืืื __init__(), ืืคืขืื ืืช ืื ืืฆืืคืื
ืืงืืจืืืื ื ืกืื ืืจืืืช
ืื ื-ioloop ืื ืกืืคืง ืืืืื ืืงืจืืื __init__() (ืืจืืจืช ืืืื), ืืชืืื
ืื ืืฆืืคืื ืื-eventloop (ืืื ืืกืืืืช ืืื). ืืืฆื ืื ืืฉืืื
ืืกืืจ ืืื ืื ืฉืื ืืืจ ืื ืื ื ืงืจื ืืฉืืื ืกืื ืืจืืืช.
ืคืจืืืจืื
cb -- ืืชืงืฉืจืืช ืืืืจืช ืืชืงืฉืจื ืืืืจ ืฉืื ืืฆืืคืื ืืืคืขืื, ืืชื
ืืืืืื ืื ืกืืคืงื.
ืืชืืื ืชืืกืคืื
Circus ืืืืข ืขื ืืขืจืืช ืชืืกืคืื ืืืืคืฉืจืช ืื ืืชืงืฉืจ ืืืชื ืงืจืงืก.
ืืขืจื:
ืื ื ืขืฉืืืื ืืืืกืืฃ ืชืืืืช circusd-stats ืืชืืกืคืื ืืืืฉื.
ืชืืกืฃ ืืืจืื ืืฉื ื ืืืงืื:
ยท ืื ืื ZMQ ืืื ืืืืจืืขืื ืฉืคืืจืกืื ืขื ืืื ืงืจืงืก
ยท ืืงืื ZMQ ืืฉืืื ืืืื ืคืงืืืืช ืงืจืงืก
ืื ืชืืกืฃ ืืืคืขื ืืชืืืื ื ืคืจื ืชืืช ืฆืืคื ืืืชืื ืืืฉืืช.
ืืื ืืืืืืืช ืืืื ืชืืกืคืื ืฉืชืืื ืืืฆืืจ ืขื ืืขืจืืช ืื:
ยท ืืขืจืืช ืืชืจืืืช ืืฉืืืืช ืืชืจืืืช ืืืืืจ ืืืงืืจืื ื ืืืฉืจ ืฆืืคื ืื ืคื ืฃ
ยท ืืืจืช ืขืฆืื
ยท ืืื ืืืืกืืฃ ืื ืืกืืจ ืชืืืืืื ืืืชืื ืืขืืืก
ยท ืืื.
Circus ืขืฆืื ืืืืข ืขื ืืื ืชืืกืคืื ืืืื ืื.
ืืฉืืืื CircusPlugin ืืืืชื
Circus ืืกืคืงืช ืฉืืขืืจ ืืกืืก ืฉืืขืืืจ ืื ืืืืฉื ืชืืกืคืื: circus.plugins.CircusPlugin
ืืืืชื circus.plugins.CircusPlugin(ื ืงืืืช ืงืฆื, pubsub_endpoint, check_delay, ssh_server=ืืื,
**ืชืฆืืจื)
ืืืืงื ืืกืืก ืืืชืืืช ืชืืกืคืื.
ืืคืฉืจืืืืช:
ยท ืืงืฉืจ -- ืืืงืฉืจ ืฉื ZMQ ืืฉืืืืฉ
ยท ื ืงืืืช ืกืืื -- ื ืงืืืช ืืงืฆื ืฉื circusd ZMQ
ยท pubsub_endpoint -- ื ืงืืืช ืืงืฆื ืฉื ืคืื/ืืฉื ื circusd ZMQ
ยท check_delay -- ืขืืืื ืืืืืงื ืืืืืืจ
ยท config -- ืืืคืื ืชืฆืืจื ืืืื ื
call(command, **ืืืืืจืื)
ืฉืืื ืืช ืืคืงืืื ืื ืงืจืงืก
ืืคืฉืจืืืืช:
ยท ืืคืงืืื -- ืืคืงืืื ืืืชืงืฉืจ
ยท ืืืืจืื -- ืืจืืืื ืืื ืฉื ืืืืช ืืคืชื ืืืืกืคื ืืฉืืื
ืืืืืจื ืืช ืืืคืื ื-JSON ืฉื ืฉืื ืืืืจื ืขื ืืื ืงืจืงืก
cast(ืคืงืืื, **ืืืืืจืื)
ืืฉ ืืฉืื ืคืงืืื ื ืงืจืงืก
ืืคืฉืจืืืืช:
ยท ืืคืงืืื -- ืืคืงืืื ืืืชืงืฉืจ
ยท ืืืืจืื -- ืืจืืืื ืืื ืฉื ืืืืช ืืคืชื ืืืืกืคื ืืฉืืื
handle_init()
ื ืงืจื ืืืฉ ืืคื ื ืืคืขืืช ืชืืกืฃ - ืืืงืฉืจ ืืฉืจืฉืืจ.
handle_recv(data)
ืืงืื ืื ืืืจืืข ืฉืคืืจืกื ืขื ืืื ืงืจืงืก
ืืคืฉืจืืืืช:
ยท ื ืชืื ืื -- ืืคืื ืืืืื ืืช ืื ืืฉื ืืืืกืจ.
handle_stop()
ืืชืงืฉืจ ืืืฉ ืืคื ื ืฉืืคืืืืื ื ืขืฆืจ ืขื ืืื Circus.
ืืืฉืจ ืืืชืื ืขื ืืื Circus, ืืืืงื ืื ืืืฆืจืช ืืืืืช ืืืจืืขืื ืืฉืื ืฉืืงืืืช ืืื
ืงืจืงืก ืืืจืืขืื ืืืืขืืืจ ืืืชื ืืืืื handle_recv(). ืื ืชืื ืื ืฉืืชืงืืื ืื ืืืคื ืืืืื ืืช
ืื ืืฉื ืืื ืชืื ืื ืขืฆืื.
handle_recv() ืฆืจืื ืืืืืช ืืืืฉื ืขื ืืื ืืคืืืืื.
ืืฉืืืื ืฉืึดืืึธื() ื ืืืืง() ื ืืชื ืืืฉืชืืฉ ืืฉืืืืช ืืืฆืืจืช ืืื ืืจืืงืฆืื ืงืจืงืก ืื ืืชื ืืื ื ื
ืชืืกืฃ ืฉืืงืืื ืืื ืืจืืงืฆืื ืคืขืืื ืขื ืืืืื.
handle_init() ื handle_stop() ืื ืจืง ืฉืืืืช ื ืืืืช ืฉืืื ืืชื ืืืื ืืืฉืชืืฉ ืืื ืืืชืื ื
ืื ืงืืช ืืช ืืงืื ืฉืื. handle_init() ื ืงืจื ืืชืื ืืฉืจืฉืืจ ืฉืื ืขืชื ืืชืืื.
handle_stop() ื ืงืจื ืืฉืจืฉืืจ ืืจืืฉื ืืืฉ ืืคื ื ืืคืกืงืช ืืืื ืืืืืืจื.
ืืชืืื a ืืืืืจ
ืืืื ื ืืชืื ืชืืกืฃ ืฉืืชืืืจ ืืงืืืฅ ืื ืืืจืืข ืฉืงืืจื ืื ืงืจืงืก. ืื ืืืงื ืืื
ืืจืืืื ื ืฉืืื ืฉื ืืงืืืฅ.
ืืชืืกืฃ ืขืฉืื ืืืืจืืืช ืื:
ื-circus.plugins ืืืืื โโCircusPlugin
class Logger(CircusPlugin):
ืฉื = 'ืืืืจ'
def __init__(self, *args, **config):
super(Logger, self).__init__(*args, **config)
self.filename = config.get('filename')
self.file = ืืื
def handle_init(self):
self.file = open(self.filename, 'a+', buffering=1)
def handle_stop(self):
self.file.close()
def handle_recv(self, data):
watcher_name, action, msg = self.split_data(data)
msg_dict = self.load_message(ืืกื)
self.file.write('%s %s::%r\n' % (action, watcher_name, msg_dict))
ืืื ืื ! ื ืืชื ืืฉืืืจ ืืช ืืืืืงื ืืื ืืื ืืืืื/ืืืืื, ืื ืขืื ื ืืชื ืืจืืืช ืืืชื ืขื ืืื
ืคืืืชืื
ืืืืืื, ืืืืจ ื ืืชื ืืืฆืื ื ื ืชืืกืคืื ืืืืื ืืชืื a ืืคืจืืืงื ืฉืื ืึฒืึดืืึธื.
ืืกืื ืง ืืงืฉืืช
ืืืงืจื ืฉืชืจืฆื ืืืฆืข ืคืขืืืืช ืืกืื ืืจืื ืืืช ืืืฉืื (ืืื ืฉืืืช ืืืจื ืื ืื ืฉืืืืฉ
periodicCall) ืืื ืฉืืชื ืืฉืชืืฉ ืืืืืื ืื ืืื ื. ืืืืืื ืฉืื ืืชื ืชืืื ืจืืฆื ืืืฉืชืืฉ
ืืื self.loop ืืคื ืฉืืื ืืืืืจ ืขื ืืื ืืืืงืช ืืืกืืก. ืืจืื ืืืืืช ืืจืืจืช ืืืืื ืืื ื ืืื
ืืืื ืืืชืื ืฉืืงืื ืื ืืืืฆืข ืืฆืคืื.
ืื ืกื a ืืืืืจ
ืืชื ืืืื ืืืคืขืื ืชืืกืฃ ืืจื ืฉืืจืช ืืคืงืืื ืขื ื ืงืจืงืก-ืคืืืืื ืคืงืืื, ืขื ืืื
ืฆืืื ืฉื ืืชืืกืฃ ืืืื:
$ circus-plugin --endpoint tcp://127.0.0.1:5555 --pubsub tcp://127.0.0.1:5556 --config filename:circus-events.log myproject.plugins.Logger
[INFO] ืืืขื ืืช ืืคืืืืื...
[INFO] ื ืงืืืช ืงืฆื: 'tcp://127.0.0.1:5555'
[INFO] Pub/sub: 'tcp://127.0.0.1:5556'
[INFO] ืืชืืื
ืืจื ื ืืกืคืช ืืืคืขืื ืชืืกืฃ ืืื ืืชืช ืืกืืจืงืืก ืืืคื ืืืชืืื ืฉืื. ืื ื ืขืฉื ืขื ืืื
ืืืกืคืช ื [ืคืืืืื:ืฉื] ืกืขืืฃ ืืงืืืฅ ืืชืฆืืจื, ืืืคื ืฉืึตื ืืื ืฉื ืืืืืื ืขืืืจ
ืืชืืกืฃ ืฉืื:
[plugin:logger]
use = myproject.plugins.Logger
ืฉื ืืงืืืฅ = /var/myproject/circus.log
ืืืฉืชืืฉ ืืื ืืืื ืืืฆืืืข ืขื ืืฉื ืืืื ืฉื ืืชืืกืฃ.
ืืืฉืจ ืงืจืงืก ืืชืืื, ืืื ืืืฆืจ ืฆืืคื ืขื ืชืืืื ืืื ืฉืืคืขืื ืืช ืืฉืืขืืจ ืืืืืื, ื
ืืืขืืืจ ืื ืืฉืชื ื ืืืจ ืืืืื ืืงืืข ืืื ืื ืืคืืืืื ืืจื ื- config
ืืืคืื.
ืืชื ืืืื ืื ืืืืกืืฃ ืคืืืืื ืืืืคื ืชืื ืืชื ืืขืช ืืฆืืจืช ื ืงืจืงืก.ืืืจืจ.ืืืจืจ ืืืืชื
ืื ืฉืืืืฉ circus.get_arbiter(), ืจืื ืกืคืจืื.
ืืืคืขืืช
ืืืืืื ืฉืื ืชืืกืฃ ื ืืขื ืืชืืืื ืืฉืื, ืื ืื ืืืืจ ืืืฉืคืืข ืขื ืืืื
ืืืฆืืขืื ืฉื ืืืขืจืืช ืื ืขืื ืืขืืืื ืฉื ืขืฉืชื ืขื ืืื ืืชืืกืฃ ืื ืขืืฉื ืืืชืจ ืืื
ืฉืืืืช ื ืงืจืงืก ืืชืืืื.
ืืืงืก
ืงืจืงืก ืืกืคืง ืืืื ืฉื ืืชื ืืืฉืชืืฉ ืืื ืืื ืืืคืขืื ืคืขืืืืช ืืืืจืืขื ืฆืืคื. ืืืื
ืืืื ืื:
ยท ืืคื ื_ืืชืื: ื ืงืจื ืืคื ื ืืคืขืืช ืืฆืืคื. ืื ืืงืจืก ืืืืจ ืื ื ืืื ืื ืืื
ืืืคืขืื ืืืคืกืงื.
ยท after_start: ื ืงืจื ืืืืจ ืืคืขืืช ืืฆืืคื. ืื ืืงืจืก ืืืืจ ืื ื ืืื ืืฆืืคื
ืืืคืกืง ืืื ืืืืคืขืื ืืืืืืช.
ยท before_spawn: ื ืงืจื ืืคื ื ืฉืืฆืืคื ืืืืื ืชืืืื ืืืฉ. ืื ืืงืจืก ืืืืจ ืื ื ืืื
ืืฆืืคื ืืืคืกืง ืืื ืืืืคืขืื ืืืคืกืงืช.
ยท after_spawn: ื ืงืจื ืืืืจ ืฉืืฆืืคื ืืืืื ืชืืืื ืืืฉ. ืื ืืงืจืก ืืืืจ ืื ื ืืื
ืืฆืืคื ืืืคืกืง ืืื ืืืืคืขืื ืืืคืกืงืช.
ยท ืืคื ื_ืขืฆืืจ: ื ืงืจื ืืคื ื ืฉืืฆืืคื ื ืขืฆืจ. ืืชืขืืืื ืืชืืฆืืช ื-hook.
ยท after_stop: ื ืงืจื ืืืืจ ืืคืกืงืช ืืฆืืคื. ืืชืขืืืื ืืชืืฆืืช ื-hook.
ยท ืืคื ื_ืืืช: ื ืงืจื ืืคื ื ืฉืืืืช ืืืช ืืชืืืื ืฉื ืฆืืคื. ืื ืืงืจืก
ืืืืจืืช ืื ื ืืื ืืืืช ืื ื ืฉืื (ืืืขื SIGKILL ืฉื ืฉืื ืชืืื)
ยท ืืืจื_ืืืช: ื ืงืจื ืืืืจ ืฉืืืืช ืืืช ืืชืืืื ืฉื ืฆืืคื.
ยท ืกืืืืกืืืงืืช_ืืืจืืืืช: ื ืงืจื ืืืฉืจ ืืชืืงืฉืื ื ืชืื ืื ืกืืืืกืืืื ืขื extended=True. ืืฉืืฉ ืืืืกืคื
ื ืชืื ืื ืกืืืืกืืืื ืกืคืฆืืคืืื ืืชืืืื ืืคืื ืืกืืืืกืืืงื ืืจืืืื.
ืืืืื
ืืงืจื ืฉืืืืฉ ืืืคืืกื ืืื ืืืงืจ ืฉืื ืืชื ืืื ืืชืงืืืืื ืืชืืืืช ืชืืืื.
ื ื ืื ืฉืืฉ ืื ืฆืืคื ืฉืคืืขื Redis ืืฆืืคื ืฉืืจืืฅ ืกืงืจืืคื ืฉื Python ืฉ
ืขืืื ืขื Redis. ืขื Circus ืืชื ืืืื ืืืืืื ืืช ืืกืืืจื-ืืค ืืืืฆืขืืช ืขืืืคืืช ืืคืฉืจืืช:
[ืฆืืคื:ืขืืื ืืชืืจ]
cmd = python -u worker.py
ืขืืืคืืช = 1
[watcher:redis]
cmd = redis-server
ืขืืืคืืช = 2
ืขื ืืืืืจื ืืื, Circus ืืชืืื Redis ืชืืืื ืืืืืจ ืืื ืืื ืืชืืื ืืช ืขืืื ืืชืืจ.
ืืื ืงืจืงืก ืื ืืืืช ืฉืืื ืืื Redis ืคืืขื. ืื ืจืง ืืชืืื ืืช
ืชืืืื ืฉืืชืืงืฉ ืืืชืืื. ืื ืฉืื ืื ื ืืชืืขืืขืื ืืื ืืื ืืจื ืืฉืืื ืืื Redis is
ืืชืืื ืืืชืคืงื ืืืืืื. ืคืื ืงืฆืื ืฉืฉืืืืช ืืื ืืืืื ืืืืืช:
ืืืืื โโredis
ืืื ืืืื
def check_redis(*args, **kw):
time.sleep(.5) # ืชื ืืื ืืืืื ืืช ืืืชืืื
r = redis.StrictRedis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')โ
return r.get('foo') == 'bar'
ืคืื ืงืฆืื ืื ืืืืื ืืืืืช ืืืืืจืช ืืกืืจืงืืก ืืชืืจ ืืคื ื_ืืชืื ืื:
[ืฆืืคื:ืขืืื ืืชืืจ]
cmd = python -u worker.py
hooks.before_start = mycoolapp.myplugins.check_redis
ืขืืืคืืช = 1
[watcher:redis]
cmd = redis-server
ืขืืืคืืช = 2
ืืจืืข ืฉืงืจืงืก ืืชืืื ืืช ืืืืจ ืฆืืคื, ืื ืืชืืื ืืช ืขืืื ืชืืจ ืฆืืคื, ืืื
ืื ืขืืงื ืืืจ ื ืขืืืคืืช ืืืื ื. ืจืืข ืืคื ื ืืคืขืืช ืืฆืืคื ืืฉื ื, ืืื ืืคืขื
ืื ืืื check_redis ืคืื ืงืฆืื, ืืืืงืจื ืฉืืื ืืืืจืช ืื ื ืืื ืืืื ืืช ืืคืขืืช ืืฆืืคื
ืืชืืืื.
ืื ืึฒืชึดืืึธื
ืื ืืืื ืืขืงืื ืืืจ ืืืชืืื ืืื:
def hook(watcher, arbiter, hook_name, **kwargs):
...
# ืื ืื ืชืืืืจ True, ืืงืจืก ืืืื ืืืฉืชื ืืช
# ืืืชื ืืืืช ืฉื ืงืจืงืก (ืชืืื ืืืืง)
ืืืืืืจ ื ืืื
ืืืคื ืฆืึนืคึถื ืืื ื ืฆืืคื ืืืืื ืืืืชื, ืคืืกืง ืื ืืื ืฉืืืจ ืืื, Hook_name ืืื
ืฉื ื ืงืืืืจืืก ืืื ืคืจืืืจืื ืืืคืฆืืื ืืืื ื ืืกืคืื (ืืืชืื ืืกืื ืืงืจืก).
ืืฉืืืื after_spawn hook ืืืกืืฃ ืืช ืคืจืืืจื pid:
def after_spawn(watcher, arbiter, hook_name, pid, **kwargs):
...
# ืื ืื ืชืืืืจ ืืช True, ืืงืจืงืก ืืืจืื ืืช ืืชืืืื
ืืืืืืจ ื ืืื
ืืืคื PID ืืื ื-PID ืฉื ืืชืืืื ืืืชืืื.
ืืื ืื, ืืคื ื_ืืืช ื ืืืจื_ืืืช ืืืื ืืืกืืคืื pid ื-signum:
def before_signal_hook(watcher, arbiter, hook_name, pid, signnum, **kwargs):
...
# ืื ืื ืชืืืืจ True, ืงืจืงืก ืื ืืฉืื ืืช ืืืช ืืกืืื
# (SIGKILL ื ืฉืื ืชืืื)
ืืืืืืจ ื ืืื
ืืืคื PID ืืื ื-PID ืฉื ืืชืืืื ืืืชืืื ื ืืชืืื ืืื ืืืืช ืืืชืืื.
ืืชื ืืืื ืืืชืขืื ืืืื ืืื ืืืืืืช ืืืฉืชืืฉ ืื ืชืื ืื ืืืฉืืืืช ืฉื ืืฆืืคื ื/ืื ืืืืจืจ
ืืืืืช ืฉืืืืฉื ืืืื ืืืื.
ืฉืืื ืื ืฉ-hooks ื ืงืจืืื ืขื ืืจืืืื ืืื ืืขืื ืฉื. ืื ืืฉืชืืฉ ืืืชืืืช ืืื ืืื
ืฉืื ืื ืฉืืืช ืืจืืืื ืืื.
ืืฉืืืื ืกืืืืกืืืงืืช_ืืืจืืืืช ืืืืง ืืฉ ืคืจืืืจืื ื ืืกืคืื ืืฉืื ื ืงืืืืจืืก:
def extended_stats_hook(watcher, arbiter, hook_name, pid, stats, **kwargs):
...
ืืืคื PID ืืื ื-PID ืฉื ืืชืืืื ืืืชืืื ื ืกืืืืกืืืงืืช ืืกืืืืกืืืงื ืืจืืืื ืืืืืช
ืืืจ. ืืืกืฃ ื ืชืื ืื ืกืืืืกืืืื ืืฉืื ืืชืื ืกืืืืกืืืงืืช. ืืืืื ื ืืฆืืช ื
examples/uwsgi_lossless_reload.py.
ืืืืืื ืืืจืื ื, ืื ื ืกืืคืจ ืื ืฉืืืื ืืืชืืืื ืขื ืื ืืื ื ืืืชืืช:
def super_hook(watcher, arbiter, hook_name, **kwargs):
pid = ืืื
ืกืืื = ืืื
if hook_name in ('before_signal', 'after_signal'):
pid = kwargs['pid']
signum = kwargs['signum']
...
ืืืืืืจ ื ืืื
ืื ืืืจืืขืื
ืืื ืคืขื ืฉืืืง ืืืคืขื, ืืชืืฆืื ืฉืื ืืงืืืช ืืืืขื ืืืืจืืข ืืงืจืงืก.
ืืฉื ื ืฉื ื ืืืจืืขืื ืืงืฉืืจืื ื-hooks:
ยท ืืืง_ืืฆืืื: ืืืง ื ืงืจื ืืืฆืืื. ืืคืชืืืช ืืืืจืืข ืื ืฉื ืืฉื ืื ื
ืืืจืืข, ืืื ืืื: ืชืืจืื ืืืืจืืขืื.
ยท hook_failure: ืืืง ื ืืฉื. ืืคืชืืืช ืืืืจืืข ืื ืฉื ืืฉื ืื ืืืืจืืข, ืืื:
ืชืืจืื ืืืืจืืขืื ื ืฉืืืื: ืืืจืื ืฉืืชืจืืฉ ืืืืจืืข, ืื ืืืื.
ืืืกืืฃ ืืืฉ ืคืงืืืืช
ื ืืกืื ื ืืืคืื ืืช ืืืกืคืช ืคืงืืืืช ืืืฉืืช ืืคืฉืืื ืืื ืืืคืฉืจ.
ืืชื ืฆืจืื ืืขืฉืืช ืฉืืืฉื ืืืจืื:
1. ืืืฆืืจ ื your_command.py ืงืืืฅ ืชืืช ืงืจืงืก/ืคืงืืืืช/.
2. ืืืืืข ืฉื ืืืืงื ืืืช, ืขื ืฉืืืืช ืืืืืจืืช ืืจืืฉ
3. ืืืกืฃ ืืช ืืคืงืืื ืืืืฉื circus/commands/__init__.py.
ื ื ืื ืฉืื ื ืจืืฆืื ืืืืกืืฃ ืคืงืืื ืฉืืืืืจื ืืช ืืกืคืจ ืืฆืืคืื ืฉื ืืฆืืื ืืขืช ืืฉืืืืฉ,
ืืืื ื ืขืืฉืื ืืฉืื ืืื (ืืืืื ืืืจืืื ืืื ืืืคืฉืจ ืื ืืขืงืื ืืืจ
ืึผึฐืงึทืืึผืช):
ื-circus.commands.base ืืืืื โโCommand
ื-circus.exc ืืืืื โโArgumentError, MessageError
class NumWatchers (ืคืงืืื):
"""ืื ืชืจืืื ืืื ืืชืืจ ืื ืืืืชื ืขืืฉื ืืื.
ืขืืื ืืคืงืืืืช ืืืจืืช ืืื ืืจืืืช ืืืฆื ืื ื ืจืืืืื ืืขืฆื
ืืืงืกื ืืื. ืื ืืืืื ืืืืืืืืช ืืชืืขืื,
ืื ืื ืชืคืื ืืืืืช ืืืฆื, ืื ืื ืฉืื ื ืขืฉื
ื.
"" "
# ืื ืืคืงืืืืช ืืืจืฉืืช ื`circus.commands.base.Command`
# ืืชื ืฆืจืื ืืฆืืื ืฉื ืืื ืืืฆืื ืืช ืืคืงืืื ืืืืฉืื
ืฉื = "numwatchers"
# ืืืืจ ืืช ืืืืชื ื ื-True ืื False ืืื ืืืืืืจ ืืช ืืชื ืืืืช ืืจืืจืช ืืืืื ืฉืื
# - ืื ืืืืชื ื ืืื True, ืืคืงืืื ืืืคืขืืช ืืืืคื ืกืื ืืจืื ื, ืืืืงืื ืขืฉืื ืืงืื
# ืชืืฆืืืช ืืืจื.
# - ืื ืืืชื ื ืืื False, ืืคืงืืื ืืืคืขืืช ืืืืคื ืืกืื ืืจืื ื ืืฉืจืช ืืืืงืื ืืืืคื ืืืืื
# ืืงืื ืืืืจื ืชืืืื 'ืืกืืจ'
#
# ืืืจืืจืช ืืืื, ืืคืงืืืืช ืืืืืจืืช ื- waiting = False
ืืืื = ื ืืื
# ืืคืฉืจืืืืช
options = [('', 'optname', default_value, 'description')]
ืืืคืืื ืื = ['foo', 'ืืจ']
# ืืืคืืื ืื ืืฆืืืื ืืช ืืจืืืื ืื ืืคืงืืื ืฉืื ืืืื. ืื ืื
# ืื ืืกืืคืง, ืื ืชืืืจื ืฉืืืื
def execute (ืขืฆืื, ืืืจืจ, ืืืืืจืื):
# ืฉืืืช ืืืืฆืืข ืืื ืืืืื ืฉื ืืคืงืืื: ืฉืื ืืื ืืช ืื
# ืืืืืงื ืฉื ืืคืงืืื ืืืืืจืช dict ืืืืื ืืช ืืขืจืืื ืฉืืชื
# ืจืืฆื ืืืืืจ, ืื ืืฉ
ืืืืจ {"numwatchers": arbiter.numwatchers()}
def console_msg(self, msg):
# msg ืืื ืื ืฉืืืืืจ ืขื ืืื ืฉืืืช ืืืืฆืืข.
# ืฉืืื ืื ืืฉืืฉืช ืืขืืฆืื ืืชืืืื ืขืืืจ ืงืื ืกืืื (ืื
# ืืฉืืฉ ืืืฉื ืขื ืืื circusctl ืืื ืืืืคืืก ืืช ืืืืืขืืช ืฉืื)
ืืืืจ "ืืืจืืืช ืฉืชืืฆื"
def message(self, *args, **opts):
# ืืืืขื ืืืคืืช ืืงืื ืืืกืืฃ.
# ืฉืืื ืื ืืฉืืฉืช ืืืืคืื ืืจืืืื ืืื ืฉื ืืกืืฃ ืืคืงืืื
# ืืคืฉืจืืืืช. (ืืื ืืฉืืฉ ืืืฉื ืืืฉืจ ืงืืจืืื ืืคืงืืื via
# circusctl)
# NotImplementedError ืชืืฉืง ืื ืืคืื ืงืฆืื ืืกืจื
numArgs = 1
ืื ืื len(args) == numArgs:
raise ArgumentError('ืืกืคืจ ืื ืืืงื ืฉื ืืจืืืื ืืื.')
else
opts['optname'] = args[0]
ืืืืจ self.make_message(**opts)
def validate (ืขืฆืื, ืืืืืจืื):
# ืฉืืื ืื ืืฉืืฉืช ืืื ืืืืช ืฉืืืจืืืื ืืื ืืืขืืจื ื-
ืคืงืืื # ื ืืื ื. ืืฉ ืืืจืืง ArgumentError ืืืงืจื
# ืืฉ ืฉืืืื ืืืจืืืื ืืื ืฉืขืืจื (ืืืฉื ืื ืื
# ืื ืืชืืืืื ืื ืืื.
# ืืืงืจื ืฉืืฉ ืืขืื ืืชืืื ืฉืืื, ืืืืขืช MessageError
ืืฉ ืืืจืืง #. ืฉืืื ืื ืืืืื ืืฉื ืืช ืืช ืืชืืื ืฉื ืืืืืืจืื
# dict, ืืื ืืืขืืจ ืืืืฆืืข ืืืืจ ืืื.
ืืฉืชืืฉ ืืงืจืื ืืืืืืืช
ืคืจืง ืื ืืฆืื ืืื ืืงืจื ืฉืืืืฉ, ืืื ืืชืช ืื ืืืฉื ืืืฆื ืืืฉืชืืฉ ื-Circus ื-Circus ืฉืื
ืกืืืื.
ืจืืฆื a WSGI ืืืฉืื
ืืคืขืืช ืืคืืืงืฆืืืช WSGI ืขื Circus ืืื ืื ืืขื ืืื ืช ืืืืืื ืฉืืชื ืืืื ืืฆืคืืช ืืื ืื
ืฉืึถืึฐืึธ ืืื ืืจื ื ืขืืืืื ืืืืฆืขืืช ืืืค ืงืจืงืก, circusctl ืื ืืืฉืง ืืืื ืืจื ื.
ืื ืืชืืคืฉืจ ืืืืฆืขืืช ืฉืงืขื ืงืจืงืก. ืจืื ืืื ืฉืงืขืื.
ื ืืงื ืืืืื ืขื ืืื ืืืื ืคืืจืืืื ืืืฉืื:
ื-pyramid.config ืืืืื โโConfigurator
ื-pyramid.response import Response
def hello_world (ืืงืฉื):
return Response('ืฉืืื %(name)s!' % request.matchdict)
config = Configurator()
config.add_route('hello', '/hello/{name}')
config.add_view(hello_world, route_name='hello')
application = config.make_wsgi_app()
ืฉืืืจ ืืช ืืกืงืจืืคื ืืื ื-an app.py ืงืืืฅ, ืืื ืืชืงื ืืช ืืคืจืืืงืืื ืืืื:
$ pip ืืืชืงืื ืคืืจืืืื
$ pip ืืืชืงืื chausset
ืืืืจ ืืื, ืืื ืฉืืชื ืืืื ืืืคืขืื ืืช ืืืฉืื ืืคืืจืืืื ืฉืื ืืืืฆืขืืช ื ืึถืจึถื ืกืงืจืืคื ืืกืืฃ:
$ chausset app.application
ืืืฉืื ืืื
ืืืฉื ื-localhost:8080
ืืืืฆืขืืช ืืชืืจ ืงืฆื ืืืืจื
ืืืืงื ืฉืืชื ืืืืืื ืืืืืข ืืืื ืืืืงืืจ http://localhost:8080/hello/tarek
ืืขืช ืืฉืืืคืืืงืฆืื ืฉืื ืคืืขืืช, ืืืื ื ืืฆืืจ ืงืืืฅ ืชืฆืืจื ืฉื Circus:
[ืงืจืงืก]
check_delay = 5
ื ืงืืืช ืงืฆื = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
stats_endpoint = tcp://127.0.0.1:5557
[watcher:webworker]
cmd = chaussette --fd $(circus.sockets.webapp) app.application
use_sockets = ื ืืื
ืืกืคืจ ืชืืืืืื = 3
[socket:webapp]
ืืืจื = 127.0.0.1
ืืฆืืื = 8080
ืืงืืืฅ ืืื ืืืืจ ืืกืืจืงืืก ืืืื ืฉืงืข ืืืฆืืื 8080 ืืจืืฅ ืึถืจึถื ืขืืืืื ืขื ืื
ืฉืงืข - ืขื ืืื ืืขืืจืช ื-fd ืฉืื.
ืฉืืืจ ืืืชื ื server.ini ืื ืกื ืืืจืืฅ ืืืชื ืืืืฆืขืืช ืงืจืงืก
$ circusd server.ini
[INFO] ืืชืืืช ืืืกืืจ ื-pid 8971
ืืืคืขืื ืฉืงืขื [INFO]
[INFO] circusd-stats ืืชืืืื
[INFO] ืืืคืืืงืฆืื ืืืคืขืื
[INFO] ืคืืกืง ืืืื ืืขืช ืืคืงืืืืช
ืืื ืฉืืชื ืขืืืื ืืคืขืื ืืช ืืืคืืืงืฆืื http://localhost:8080/hello/tarek.
ืืื ืืื ! ืืฉ ืื ืืืฉืื WSGI ืฉืืจืืฅ 3 ืขืืืืื.
ืืชื ืืืื ืืืคืขืื ืืช circushttpd ืื ืืช ื-cli, ืืืืื ืืช ืื ืืืื ืงืจืงืก.
ืจืืฆื a ื'ื ืื ืืืฉืื
ืืคืขืืช ืืคืืืงืฆืืืช Django ื ืขืฉืืช ืืืืืง ืืื ืืคืขืืช ืืคืืืงืฆืืืช WSGI. ืืืฉืชืืฉ ื
PYTHONPATH ืืื ืืืืื ืืช ืืกืคืจืืื ืื ื ืืฆื ืืคืจืืืืงื, ืืกืคืจืืื ืืืืืื ืืช
ืกืคืจืืื ืฉืืฉ ืื settings.py (ืขื Django 1.4+ ืืฉ ืืกืคืจืืื ืืื manage.py)
:
[socket:dwebapp]
ืืืจื = 127.0.0.1
ืืฆืืื = 8080
[watcher:dwebworker]
cmd = chaussette --fd $(circus.sockets.dwebapp) dproject.wsgi.application
use_sockets = ื ืืื
ืืกืคืจ ืชืืืืืื = 2
[env:dwebworker]
PYTHONPATH = /path/to/parent-of-dproject
ืื ืืชื ืฆืจืื ืืขืืืจ ืืช DJANGO_SETTINGS_MODULE ืขืืืจ ืขืืื backend ืืืฉื, ืืชื ืืืื
ืืืขืืืจ ืืช ืื ืื ืืืจืืช ื env ืืคืฉืจืืช ืชืฆืืจื:
[watcher:dbackend]
cmd = /path/to/script.py
ืืกืคืจ ืชืืืืืื=3
[env:dbackend]
PYTHONPATH = /path/to/parent-of-dproject
DJANGO_SETTINGS_MODULE=dproject.settings
ืึดืจึฐืืึนืช http://chaussette.readthedocs.org ืืืืืข ื ืืกืฃ ืขื chausset.
ืขืืฆืื ืืืืืืช
ืืืืคื ืืืื ืืจืืืืงืืืจื
[ืชืืื ื]
ืงืจืงืก ืืืจืื ืืชืืืื ืขืืงืจื ืื ืงืจื ืงืจืงืก ืฉืืืืืช ืืืคืขืื ืืช ืื
ืชืืืืืื. ืื ืชืืืื ืืื ืืื ืขื ืืื ืงืจืงืก ืืื ืชืืืื ืืื ืฉื ืงืจืงืก.
ืชืืืืืื ืืืืจืื ืื ืืงืืืฆืืช ืื ืงืจืืืช ืฆืืคืื. ืฆืึนืคึถื ืื ืืขืฆื ืคืงืืื
ืงืจืงืก ืคืืขื ืขื ืืืขืจืืช ืฉืื, ืืืื ืคืงืืื ืืชื ืืืื ืืืืืืจ ืืื ืชืืืืืื ืืชื
ืจืืฆื ืืจืืฅ.
ืืจืขืืื ืฉื ืฆืึนืคึถื ืฉืืืืฉื ืืืฉืจ ืืชื ืจืืฆื ืื ืื ืืช ืื ืืชืืืืืื ืืืจืืฆืื ืืช
ืืืชื ืคืงืืื -- ืืื ืืคืขื ืืืชื ืืืืฉ ืืื'.
ืงืจืงืก ืืืืจ ืฉื ื ืฉืงืขื ZeroMQ:
ยท REQ/REP -- ืฉืงืข ืืืฉืืฉ ืืฉืืืื ืงืจืงืก ืืืืฆืขืืช ืืืืกืก json ืคืงืืืืช.
ยท PUB/SUB -- ืฉืงืข ืฉืื ืงืจืงืก ืืคืจืกื ืืืจืืขืื, ืืื ืืชื ืืชืืื ืชืืืื ืื
ืขืฆืจ.
ืืขืจื:
ืืืจืืช ืฉืื, ZeroMQ ืืื ื ืืขืจืืช ืื ืืืื ืชืืจืื. ืชืืฉืื ืขื ืื ืืขื
ืกืคืจืืืช ืชืงืฉืืจืช ืืื ืชืืืืืื (IPC).
ืชืืืื ืืืจ ื ืงืจื ืกืืืืกืืืงืืช ืงืจืงืก ืื ืืื ืขื ืืื ืงืจืงืก ืืืฉืจ ืืืคืฉืจืืช ืืืคืขืืช.
ืกืืืืกืืืงืืช ืงืจืงืกืชืคืงืืื ืืื ืืคืจืกื ื ืชืื ืื ืกืืืืกืืืื ืฉื ืฉืืืืฉ ืืืขืื/ืืืืจืื ืืงืืืฅ ืืืขืืื PUB/SUB
ืขืจืืฅ.
ืขืจืืฅ ืืืืื ืื ืืฉืืฉ ืืช ืืืค ืงืจืงืก ื ืงืจืงืก-httpd ืืื ืืืฆืื ืืจื ืื
ืฉื ืืคืขืืืืช.
ืืืค ืงืจืงืก ืืื ืกืงืจืืคื ืงืื ืกืืื ืืืืงื ืืืง ืขืืืื ืืื ืืืฆืื ืืช ืื ืืฉืืืืฉ ืืืขืื ืืืืืืจืื ืฉื
ืืชืืืืืื ืื ืืืื ืงืจืงืก.
ืงืจืงืก-httpd ืืื ืืืฉืง ื ืืืื ืืืื ืืจื ื ืฉืืืคืฉืจ ืื ืืืฆืืจ ืืื ืืจืืงืฆืื ืขื Circus. ืื
ืืฆืื ืืจื ืื ืืืืฆืขืืช ืฉืงืขื ืืื ืืจื ื ื- ืกืืืืกืืืงืืช ืงืจืงืก ืขืจืืฅ, ืืื ืื ืืืคืฉืจ ืื
ืืืชืขืจืื ืขื ืงืจืงืก ืืจื ืฉืื REQ/REP ืขืจืืฅ.
ืืืืจืื ืืืื, circusctl ืืื ืืื ืฉืืจืช ืคืงืืื ืืืืคืฉืจ ืื ืื ืืื ืงืจืงืก ืืจื ืฉืื
REQ/REP ืขืจืืฅ.
ืืชื ืืืื ืื ืืงืื ืชืืกืคืื ืฉื ืจืฉืืื ืืืืื ืงืจืงืก's PUB/SUB ืขืจืืฅ ืืืชืช ืื ืืฉืืื
ืคืงืืืืช ื- REQ/REP ืืื ืขืจืืฅ circusctl ืืื.
ืืืืื
Circus ืื ืื ืืืืง ืืขืืืื ืฉื ืกืคืจืืืช ZeroMQ ืืืืืข ืืื ืืืืื ืืื
ืคืจืืืืงืืืื. ืขื ืืืช, ืืชื ืืืื ืืืคืขืื ืืขืจืืช Circus ืขื ืฉืจืช ืืืืืืืจ ืื ืืจืช SSH ืืื
ืืืฉืช ืืืื ืืืืื ื ืืืจืช.
ืืืง ืื ืืกืืืจ ืื Circus ืขืืฉื ืืืขืจืืช ืฉืื ืืฉืืชื ืืคืขืื ืืืชื, ืืืกืืคื ืฉื ืืืจ
ืืชืืจ ืืืฆื ืืืฉืชืืฉ ืืื ืืจืช SSH.
ืืชื ืืืื ืื ืืงืจืื http://www.zeromq.org/area:faq#toc5
TCP ืืฆืืืืช
ืืืจืืจืช ืืืื, Circus ืคืืชื ืืช ืืฆืืืืช ื-TCP ืืืืืช ืืืืจื ืืืงืืื:
ยท 5555 - ืื ืื ืืืฉืืฉ ืืฉืืืื ืืงืจืงืก ืืืืฆืขืืช circusctl
ยท 5556 -- ืืืฆืืื ืืืฉืืฉืช ืืขืจืืฅ ืืืคืจืกื/ืื ืืืื.
ยท 5557 -- ืืืฆืืื ืืืฉืืฉืช ืืขืจืืฅ ืืกืืืืกืืืงื -- ืื ืืืคืขืืช.
ยท 8080 -- ืืืฆืืื ืืืฉืืฉืช ืืช ืืืฉืง ืืืฉืชืืฉ ืืืื ืืจื ื -- ืื ืืืคืขืืช.
ืืฆืืืืช ืืื ืืืคืฉืจืืช ืืืคืืืงืฆืืืช ืืงืื ืืงืืื ืืื ืืจืืงืฆืื ืขื ืืขืจืืช Circus ืฉืื, ืืืืชืื ืืืืคื ืฉืื
ืืชืฉืชืืช ืฉืื ืืืืจืื ืช, ืืืชืื ืฉืชืจืฆื ืืืื ืขื ืืืฆืืืืช ืืืื ืืืืฆืขืืช ืืืืืช ืืฉ or
ืืืืืืจ ืืช Circus ืืจืืฅ ืืืืฆืขืืช IPC ืืฆืืืืช.
ืื ื ืืืืื ืืืคืขืืช Circus ืืืืฆืขืืช ื ืงืืืืช ืื ืืกื ื-IPC ืืืื:
[ืงืจืงืก]
check_delay = 5
ื ืงืืืช ืงืฆื = ipc:///var/circus/endpoint
pubsub_endpoint = ipc:///var/circus/pubsub
stats_endpoint = ipc:///var/circus/stats
ืืืฉืจ ืืืืืจืื ืืืืฆืขืืช IPC, ืืฉ ืืืคืขืื ืืช ืืคืงืืืืช ืืืืชื ืชืืื, ืื ืืฃ ืืื ืื ืืืื
ืืืฉืช ืืืืื ืืืืืฅ, ืื ืืืื ืืฉืืืืฉ ื-TCP. ืืฉ ืืืคืขืื ืืช ืืคืงืืืืช ืื ืืืฉืชืืฉ ืฉ
ืืฉ ืืืฉืช ืืชืืื ืื ืชืืื ืฉืงืข ื-ipc. ืืชื ืืืื ืืฉื ืืช ืืช ืืืขืืื ืฉื ื ืงืืืช ืกืืื ืืืืฆืขืืช
ืื ืืื endpoint_owner ืืคืฉืจืืช ืชืฆืืจื. ืื ืืืคืฉืจ ืื ืืืคืขืื ืืช circusd ืืืฉืชืืฉ ืืฉืืจืฉ, ืืื
ืืืคืฉืจ ืืชืืืืืื ืฉืืื ื ืฉืืจืฉ ืืฉืืื ืืืืื ืคืงืืืืช ืงืจืงืก. ืฉืืื ืื ืื ืืขืช ืืฉืืืืฉ endpoint_owner,
ืขื ืื ืช ืืื ืืข ืืชืืืืืื ืฉืืื ื ืฉืืจืฉ ืืืืืช ืืกืืื ืืืชืืื ืชืืืืืื ืฉืจืืจืืชืืื ืื
ืืจืืฅ ืขื ืืจืฉืืืช ืืืืืืช ืืืชืจ, ืคืงืืืช ืืืืกืคื ืชืืืืฃ ืฉ-Watchers ืืืฉืื ืืืืืื ืืคืขืื ืืชืืจ
ืื ืืื endpoint_owner ืึดืฉืืชึทืึตืฉื. ืืืืจืืช Watcher ืืงืืฆื ืืชืฆืืจื ืืืงืืืืื ืื ืืืื
ืืืืื ืืืจื ืื.
ืืืืื, ืื ืชืคืขืื ืืช ืืืฉืง ืืืฉืชืืฉ ืืืื ืืจื ืื, ื 8080 ืื ืื ืขืืืื ืืืื ืคืชืื.
circushttpd
ืืืฉืจ ืืชื ืืคืขืื circushttpd ืืืืคื ืืื ื, ืื ืืืฉืจ ืืชื ืืฉืชืืฉ ื- httpd ืืคืฉืจืืช ืืงืืืฅ ini ืืื
ืึถื:
[ืงืจืงืก]
check_delay = 5
ื ืงืืืช ืงืฆื = ipc:///var/circus/endpoint
pubsub_endpoint = ipc:///var/circus/pubsub
stats_endpoint = ipc:///var/circus/stats
httpd = 1
ืืคืืืงืฆืืืช ืืืื ืืจื ื ืชืคืขื ืืืฆืืื 8080 ืืืืคืฉืจ ืืื ืืื ืืืฉืช ืืืฃ ืืืื ืืจื ื
ืื ืื ืืช ืงืจืงืก ืืืื.
ืื ืืืื ืืฆืืจืช ืฆืืคืื ืืืฉืื ืฉืืืืืื ืืืจืืฅ ืื ืคืงืืื ืืืขืจืืช ืฉืื!
Do ืึนื ืืขืฉืืช it ืืคืืืื ืืืื
ืื ืืชื ืจืืฆื ืืืื ืขื ืืืืฉื ืืคืื ื ืืืื ืืจื ื, ืืชื ืืืื ืืืืืฉ ืืืชื ืืืืืจื Nginx ืื
Apache ืื ืื ืฉืจืช ืืื ืืจื ื ืืขื ืืืืืช ืคืจืืงืกื, ืฉืืืื ืืืืื ืืืืืื.
ืืฉืชืืฉ ื ืงึฐืืึผืฆึธื ืืจืฉืืืช
ืืืจืืจืช ืืืื, ืื ืืชืืืืืื ืฉืืชืืืื ืขื Circus ืืคืขืื ืขื ืืืชื ืืฉืชืืฉ ืืงืืืฆื
as ืงืจืงืก. ืืืชืื ืืืจืฉืืืช ืฉืืฉ ืืืฉืชืืฉ ืืืขืจืืช, ืืืชืื ืฉืื ืืืื ืื
ืืืฉื ืืื ืืชืืื ืืช ืฉ-Circus ืืกืคืง.
ืืืืืื, ืชืืื ืืช ืกืืืืกืืืงื ืืกืืืืืช ืืชืืืืืื ืคืืขืืื ืืืจืฉืืช ืืจืฉืืืช ืืืจืืืืช.
ืืืจื ืืื, ืื ืืกืคืจื ืืฉืืืืฉ ืืืขืื ืืชื ืืงืื ืืืืฆืขืืช ืกืืืืกืืืงืืช ืืคืงืืื ืื N / A, ืื ืืืืจ ืฉืื
ืืืฉืชืืฉ ืื ืืืื ืืืฉืช ืืงืืฆื ืืคืจืืฆืืืจื. ืื ืืืื ืืืงืจื ืืืจืืจืช ืืืื ืชืืช Mac OS X.
ืืชื ืืืื ืืจืืฅ ืงืจืงืก ืืชืืจ root ืืื ืืชืงื ืืช ืื, ืืืืืืืจ ืืช uid ื gid ืขืจืืื ืขืืืจ ืื ืฆืืคื
ืืื ืืงืื ืืช ืื ืืชืืื ืืช.
ืืื ืืืืืจื ืืจืืฆื ืงืจืงืก ืืื ืฉืืจืฉ ืืืฉืฃ ืืืชื ืืืกืืื ืคืืื ืฆืืืืืช ืฉื ืืจืฉืืืช
ืืืืื. ืืื ื ืื ืื ื ืขืืฉืื ืืืืื ืืืืืชื ื ืืื ืืืืื ืข ืืื ืืื, ืคืืขื ืืฉืืจืฉ ืืืชืืืื ืขื ืืื ืื
ืืืฆืข ืคืขืืืืช ืื ืจืฆืืืืช ืืืขืจืืช ืฉืื ืขืืื ืืืืืช ืืกืืื.
ืืืจื ืืืืื ืืืืชืจ ืืื ืืข ืืืช ืืื ืืืืื ืฉืืืขืจืืช ืฉืืคืขืืื ืืช Circus ืืื ืืืื
ืืืืื (ืืื VM) or ืืืคืขืื ืืช ืื ืืืขืจืืช ืชืืช ืืฉืชืืฉ ืืืืงืจ.
SSH ืื ืืืจ
ืืงืืืืช ืืืืืื ืืืชืืืจ ื- a ืงืจืงืก ืืืคืข ืขื ืืื ืืฆืืจืช ืื ืืจืช SSH. ืืื ืืขืฉืืช ืืืช, ืืขืืจ ืืช
ืืคืฉืจืืช ืฉืืจืช ืคืงืืื --ืฉืฉ ืืืจืื user@address, ืฉื ืืืฉืชืืฉ ืืื ืืืฉืชืืฉ ืืฉืื
ืฉืจืช ื ืืชืืืช ืืื ืืชืืืช ืืฉืจืช ืืคื ืฉื ืจืืชื ืขื ืืื ืืืงืื. ืคืจืืืืงืื SSH ืืืื
ืืืจืฉืื ืืืฉืืจืื ืืื ืืืฉืืื ืืช ืืื ืืกื.
If ืงืจืงืก ืืคื ืฉื ืจืื ืขื ืืื ืฉืจืช SSH ืืื ื ืืืชืืืช ืืจืืจืช ืืืืื ืฉื ื ืงืืืช ืืงืฆื 5555
ืืืืจ ืืื ืฆืืื ืืช ืงืจืงืก ืืชืืืช ืืืืฆืขืืช ืืืคืฉืจืืช --ื ืงืืืช ืงืฆื
ืึฐืืึผืืึธื ืืชืงื ื ืืืืื
ืืืืจืช ืฉืจืช Circus ืืืืืื ืืืืื ืืืชืืฆืข ืขื ืืื:
ยท ืืคืขืืช ืฉืจืช SSH
ยท ืืคืขืืช Apache ืื Nginx ืขื 80 ืืฆืืื, ืืขืืฉื ืคืจืืงืกื ืืคืื ืขื 8080 ื ึธืึธื.
ยท ืืกืืืช ื 8080 ื ืื ืืืืฉื ืืืืืฅ.
ยท ืืคืขืืช ืื ืืฆืืืืช ZMQ Circusd ืืืืฆืขืืช ืงืืฆื IPC ืืืงืื ืืฆืืืืช TCP, ืืื ืืืจ ืฉื ืื
ืฉืืืืช ืืจื SSH.
[ืชืืื ื]
ืชืจืืื ื ืงืจืงืก
ืงืจืงืก ืืืงื ืืืืืืื ืืื ืืืืจื ืฉืื ืืื ืื ืืืืฉืืจ ืจืง ืฉื. ืื ืื ื ืื ืกืื
ืืื ืืช ืืื ืฉืืืืฉื ืขืืืจ ืืืจืื ืื ืืชื ืืืจืืื ืืงืืืช.
ืื ืื ื ืืืืช ืคืชืืืื ืืื ืชืจืืื, ืืฆืืจื ืฉื ืงืื, ืชืืขืื, ืืืื ืื,
ืืฆืขืช ืชืืื ื ืืื'.
ืืชื ืืืื ืืืชืืื ื ืืฉื ืืจืฉืืืช ืืชืคืืฆื ืฉืื ื: http://tech.groups.yahoo.com/group/circus-dev/
ืื ืืืกืฃ ืืขืื ืืฆืื ื ืืื ืืฉืฉ
ืงืืืขื ืฉืืืืืช ืืงืืื ื ืฉืืคืืจ ืื ืืื ืชืืขืื
ืื ืืืืื ืืคืฉืจื ืฉืืขืื ืืื ืฉืื ืืืืืืช ืืืื ืงืจืืืช ืืืฆื ืืื ืืืืช ืืื
ืชืืขืื ืืฆื ืฆืจืคืชื, ืื ืชืืกืก ืืชืจืื ืื ื ืืกืื ืืืืฉ / ืฉืืคืืจ
ืืืืคืก ืืชืืขืื. ืื ืจืื ืฉืืชื ืืคืืื ืื ืฆืจืื ืืืืื ืืื ืงืจืงืก ืขืืื
ืืชืืช ืืืืกื ืืื ืืข ืืื ืืขืฉืืช ืืืช.
ืืืกืืฃ ืืืฉ ืืืคืืื ืื
ืชืืื ืืช ืืืฉืืช ืืืขืจืืืช ืืืืื ืืืื. ืื ืืฉ ืื ืืช ืืฆืืจื ืืืืื ืืื
ืืขืืื ืขื ืชืืื ืืช ืืืฉืืช, ืืืกืคืชื ืืกืืจืงืืก ืื ืืืืจื ืืืืืช ืื ืื ืืกืืืืช. ื ืืกืื ื ืืืื
ืงืฉื ืืงืื API ื ืงื ืืืืื, ืืงืืื ืฉืื ืืฉืจืช ืืช ืืืืจื.
ืชืฆืืจื ืืืืกืืฃ ืชืืขืื ืืืืืงืืช ืืฆื ืืงืื ืฉื ืืชืืื ื ืืืืฉื.
ืืืจืช ืื ื ืืื ืืงืื ืืช ืืชืืงืื.
ืืื ื ืืืืืฉ ืฉืึถืึฐืึธ ืฉืื ืืืื
ืื ืื ื ืืฉืชืืฉืื ื-git ืืชืืจ DVCS. ืืืจื ืืืืื ืืืืชืจ ืืืฆืืข ืฉืื ืืืื ืืื ืืืฆืืจ ืกื ืืฃ ืฉืื
ืฆื (ืืจื ืกืืืื ืืชืฉืืื -b ืฉื ืืกื ืืฃ) ืืืฆืข ืืช ืืฉืื ืืืื ืฉืื ืฉื. ืืจืืข ืฉืืฉ ืื
ืืฉืื ืืืื ืืคืจืืื ืืืื, ืชืืฆืื ืืงืฉืช ืืฉืืื ื ืื ืืกื ืืฃ ืืื.
ืื ื ืขืืงืืื ืืืจ ืืืืื ืืื ืืื ืืืคืฉืจ ืฆืืืื ื ืืื ืืื ืืชืืื ืืช ืฉืืชื
ืืฆืืข. ืืืืืื, ืื ื ืืืืืื ืืงืื ืืงืฉืช ืืฉืืื ืืืช ืชืื ืืื ืืืื
ืืขืื ืืื.
ืืคื ื ืฉืืชื ืืฆืืข ืืช ืืฉืื ืืืื ืฉืื, ืืืืง ืฉืื ืฉืื ืื ืฉืืืจืื ืฉืื ืืืจ! ืืชื ืืืื
ืืืฉืชืืฉ ืจืขื ืืคืงืืื ืืื ืืืืืื ืืืช, ืืื ืชืคืขืื ืืช testsuite ืชืืช ื- different
ืืจืกืืืช ืคืืชืื ื ืชืืืืช.
ืืืงืฉื ืชืฉืชืืฉ : http://issue2pr.herokuapp.com/ ืืืชืืืืก ืืืชืืืืืืช ืืงืจืงืก ืงืืื
ืืขืื, ืื ืืืื.
ืืืื ืขืืช ืืืื ืืชืืืื
ืืืื ืขืืช ืืืชืืืืืืืืช ืืืืื ืืืคืฉืจืช ืืงืื ืืืกืืืจืื ื ืงืืื ืืงืจืืื. ืืื ืืขืฉืืช ืืืช, ืืืงืื
ืขืืฉื "git pull" ืื ืืชื ื-git ืืืคื ืืืืืืืื ืขืืืจื, ืืืืฆืขืืช git pull --rebase will
ืืฉืื ืืช ืืฉืื ืืืื ืฉืื ืืืจื ืืฉืื ืืืื ืฉืืชืืืืืื ืืกื ืืฃ, ืื ืืืฉืจ ืขืืืืื ืขืืืื
ืืืื.
ืืืืืจ, ืขืืืจื ื ืืคืชืื ืืืืื, ืื ื ืืชื ืืืชืจ ืืืฉืชืืฉ ื-github ืืืจืืง ืืฉืืืืฉื
ืืคืชืืจ ืขื ืืงืฉืืช ืืฉืืื ืื ืืคืชืืื ืื ืืืกืกื ืืืืฉ ืืช ืืขืืืื ืฉืืื ืืขืฆืื ืื ืื ื ืืื
ืืื ืจื ืืื ืืื ืืืงืฉื ืืืืืื ืืคืืขื. ืืืงืื ืืืช, ืืืจืืื ื ืจืืืช ืื:
git remote ืืืกืฃ ืฉื ืืืืจ ืืชืืืช ืืชืจ
ืฉื ืืืืืจ git
git checkout feature-branch
git rebase master
# ืืืืง ืฉืืื ืขืืื ืืื ืฉืฆืจืื ืืื ืืชืืื ืืืืกืืจ
ืืืกืืจ ืืงืืคืืช
git merge feature-branch
ืืืืื
ืื ืืชื ืืืฆื ืืช ืขืฆืื ืืงืืง ืืขืืจื ืืืฉืื ืืืื ืฉืืชื ืืกืชืื ืขื ืืงืื ืฉื ืงืจืงืก, ืืชื ืืืื ืืืืช
ืืืฆื ืืืชื ื ื-irc ืืืชืืืช #ืืืื ืงืจืงืก on irc.freenode.org (ืื ืื ืืื ืื IRC
ืืงืื, ืืืฉืชืืฉ ืื ืืื ืืื ืืจื ื ืฆ'ืื)
ืืชื ืืืื ืื ืืคืชืื ืฉืจืฉืืจ ืืจืฉืืืช ืืชืคืืฆื ืฉืื ื -
http://tech.groups.yahoo.com/group/circus-dev
ืืขืชืื ืงืจืืืืช ืฉืื ืฉืืืืช
ืืืื ืจืฉืืื ืฉื ืฉืืืืช ื ืคืืฆืืช ืขื ืงืจืงืก:
ืืื ืขืืฉื ืงืจืงืก ืืขืจืื ืึฐืึทืฉืึฐืืึนืช ื a ืงืืืกื ืึทืขึฒืจืึนื?
ืืขืจืืืช WSGI ืงืืืกืืช, ืืฉ ืื ืฉืจืช ืืื Gunicorn ืฉืืฉืจืช ืขื ืคืืจื ืื an
ืฉืงืข ืืื ืืงืก ืื ืคืจืก ืืืจื ืืื ืืืืืจื ืฉืจืช ืืื ืืจื ื ืืื Nginx: [ืชืืื ื]
ืืงืืืืช ืืชืงืฉืจืื ื-Nginx, ืืฉืจ ืืคื ื ืืช ืื ืืฉืืืืช ื-Gunicorn.
ืื ืืชื ืจืืฆื ืืืืื ืฉืชืืืื Gunicorn ืืืฉืืจ ืคืขืื, ืขืืื ืืืฉืชืืฉ ื-a
ืชืืื ืืช ืืื Supervisord ืื upstart.
ืืื ืืงืืจื ืืชืืจื ืฆืืคื ืืชืืืืืื ืฉืื ("ืขืืืืื").
ืืืืืื ืืืจืืช ืืชื ืืฉืชืืฉ ืืฉืชื ืจืืืช ืฉื ื ืืืื ืชืืืืืื. ืืื ืฉืืชื ืื ืื ื
control (ืกืืคืจvisord), ืืืื ืฉื ื ืฉืืชื ืฆืจืื ืื ืื ืืืืฉืง ืืฉืชืืฉ ืืืจ, ืขื ื
ืคืืืืกืืคืื ืฉืื ื ืืคืืืช ืฉืืืื ืขื ืื ืฉืงืืจื (ืื ืฉื ืฉืจืช wsgi)
ืื ื ืืื ืขืืืจ Gunicorn ืืจืื ืฉืจืชื WSGI ืืจืืื ืชืืืืืื ืืืืฅ ืฉืื ื ืืืืจ.
uWsgi ืงืฆืช ืฉืื ื ืืืืืื ืฉืืื ืืฆืืข ืฉืคืข ืฉื ืืคืฉืจืืืืช.
ืืื ืื ืืชื ืจืืฆื ืืืืกืืฃ ืฉืจืช Redis ืืขืจืืื ืฉืื, ืืชื ืืฆืืจื ืืกืืคื ืฉื ืืืจ ืื ืืืื ืฉืื
ืืืกื ืืช ืชืืืืืื ืืฉื ื ืืงืืืืช ืฉืื ืื.
ืืืืฉื ืฉื ืงืจืงืก ืื ืืฉื ืื ืืื ืื ืื ืชืืืืืื ื ืฉืงืขืื.
ืขืจืืืช ืงืจืงืก ืืืืื ืืืืจืืืช ืื: [ืชืืื ื]
ืื, ืืื ืืื ืืงืืจื, ืกืืจืงืืก ืืกืืื ืืืื ืฉืงืข ืฉืืืฉืื ืขื ืืื Nginx. ืงืจืงืก
ืื ืชืชืืืื ืขื ืืืงืฉืืช ืืื ืคืฉืื ืงืืฉืจ ืืช ืืฉืงืข. ืื ืื ืชืืื ืืขืืื ืืื ืืจื ื
ืชืืืื ืงืืืช ืืืืืจืื ืขื ืืฉืงืข ืืืืฆืข ืืช ืืขืืืื.
ืืื ืืกืคืง ืชืืื ืืช ืฉืืืช ื-Supervisord, ืื ืื ืืืคืฉืจ ืื ืื ืื ืืช ืืืื
ืชืืืืืื ืืืืชื ืจืื, ืืื ืื ืื ืขืืืื ืืื ืืจื ื ืื Redis ืื ืื ืืืจ ืืืจ. ืืืกืคืช ื
ืขืืื ืืื ืืจื ื ืืืฉ ื ืขืฉื ืืืืืง ืืื ืืืกืคืช ืชืืืื Redis ืืืฉ.
ืกืคืกืืื
ืขืฉืื ื ืืื ืกืคืกืืื ืืื ืืืฉืืืช ืืช Circus & Chaussette ืขื Gunicorn. ืืกืืืื, ืงืจืงืก ืืื
ืื ืืืกืืฃ ืชืงืืจื ืืืฉืื ืืืชื ืืืื ืืืกืืฃ ืืจืื ืงืฆื ืงืฆื ืขืืืจ ืขืืืื ืืืื ืืจื ื ืฉืื.
ืจืื:
ยท http://blog.ziade.org/2012/06/28/wgsi-web-servers-bench
ยท http://blog.ziade.org/2012/07/03/wsgi-web-servers-bench-part-2
ืืื ื ืืคืชืืจ ืงืจืงืก?
ืืืจืืจืช ืืืื, ืงืจืงืก ืฉืืืจ ืขื ืืจืืฉืื ืฉืื stdout ืืืืื ืืืื. ืืืกืจ ืชืคืืงื ืื ืืืื
ืืืงืฉืืช ืขื ืคืชืจืื ืืขืืืช ืืืฉืจ ื ืจืื ืฉืชืืืืืื ืืชืงืฉืื ืืืชืืื.
ืืื ืืืืืืจ ืืช ืืจืืฉืื ืงืจืงืก ืืกืคืง, ื ืกื ืืืืืื ืืช ืจืืช ืืืืื. ืืจืืืช ืืช ื
ืจืืืช ืืืื ืืืื ืืช ืคืฉืื ืืฉืชืืฉ ื- - ืขืืจื ืืื.
$ circus --log-level debug test.ini
ืืืืช ืืืืจื ืืืช. ืื ืชืืืื ืืชื ืืคืฃ ืืจืืช ืืืื ื ืืคืื ืืืืืื ืืืคืขืืช, ืืชื
ืืจืื ืืืืขืืช ืขืืืจ ืื ื ืืกืืื ืืชืืื. ืื ืขืฉืื ืืืืืช ืืืขืื ืืืืืืจ ืืช ืืืคืืืงืฆืื ืืืืืจ
ืืชื ืืคืคืช ืืืฉืชืืฉ ื ืขืืืื_ืืืืื ืืืื ืืช ืืืืืขืืช ืืงืฆื ื ืืชื ืื ืืืื.
[watcher:webapp]
cmd = python -m myapp.wsgi
delay_warmup = 5
ืืืจืืจืช ืืืื, stdout ื ืกืืืจืจ ื ืืืืื ืขื ืืื ื ืงืจืงืก ืชืืืื. ืื ืืชื ืืืืง ืืช ืฉืื
config ืืืจืฆืื ื ืืจืืืช ืืช ืืคืื ืืืชืื ืืคืื circusd, ืืชื ืืืื ืืืืืืจ ืืช
ืฆืืคื ืืืฉืชืืฉ ื StdoutStream ืืขืื.
[watcher:webapp]
cmd = python -m myapp.wsgi
stdout_stream.class = StdoutStream
stderr_stream.class = StdoutStream
ืื ืืืืฉืื ืฉืื ืืืืฆืจ ืขืงืืืช ืื ืฉืืืื ืืืฉืจ ืืื ืื ืกื ืืืคืขืื ืืืชื
ืืืืจ ืืืืืช ืืกืืื ืืจืืืช ืืช ืื ืืคืื.
changelog ืืืกืืืจืื
0.12.1 - 2015-08-05
ยท ืชืงื ืฉืืืื ืืขืช ืืคืขืื ืืืืฉ ืฉื ืฆืืคื ืขื ืืจื ืคืื - #913
ยท ืฉืื ืืืื ืงืืื ืืืกืื
0.12 - 2015-06-02
ืืืืืจื ืื ืืืืื ืืช ืืชืืืื ืฉื Python 3.4, Tornado 4 ื-Windows, ืืื ืืื ืืจืชืงืื
ืชืืื ืืช ืืชืืงืื ืื.
ืืชืืืื ืฉื Windows ืขืืืื ื ืืกืืื ืืช ืืืื ื ืืืคืืช ืืืจืืื.
ืฉืื ืืืื ืขืืงืจืืื:
ยท ืชืืืืืช ืขื Python 3.4 - #768
ยท ืชืืืื ื ืกืืื ืืช ื-Windows - #788
ยท ืชืืืืืช ืขื Tornado 4 - #872
ยท ืืจืืืช ืืืืื ืืืืืฉืช - #896 - #903
ยท ืืืกืฃ ืชืืืื ืืืืืช ืชืืืื Papa - #850
ยท ืืืกืฃ ืืชืืืช ืืืื ืืืจืกืืืช ืจืืืืืช ืืืคืขืื, ืขืฆืืจื ืืืคืขืื ืืืืฉ ืฉื ืฆืืคืื - #829 -
#902
ืฉืื ืืืื ื ืืกืคืื:
ยท ืืืคืืืืืืฆืื ืฉื ืืืืืื - #784 - #842
ยท ืืืกืฃ ืืคืฉืจืืช ืืฆืืื ืืจืกืช virtualenv ืขืืืจ ืืฆืืคืื - #805
ยท ืืืกืฃ ืืคืฉืจืืช --nostop ืืคืงืืื rmwatcher - #777
ยท ืืืกืฃ ืืชืงืฉืจืืช ืืืืจืช ื-Arbiter.start - #840
ยท ืชืงื ืฉืืืจื ืืขืื ื ืืืืฉ ืืืืชืืืช ืืืืืืช - #823
ยท ืืกืจ ืฉืงืข ืืืืฃ ืืืืื ืกืืืืกืืืงื - #843
ยท ืชืงื ืฉืืืืจ ืจืืืื ื-SunOS - #876
ยท ืกืืืจ ืืจืื ืคืื ืืขืช ืขืฆืืจืช ืฆืืคื - #885
ยท ืชืงื ืฉืืืืช ืืืชืืช ืื ืืืื ืขื --ืจืงืืจืกืืื - #888
0.11.1 - 2014-05-22
ยท ืชืืงื ืจืืจืกืื ืฉืฉืืจื ืืช ืงืจืงืก ื-2.6 - #782
0.11 - 2014-05-21
ืืืืืจื ืื ืืื ื ืืฆืืื ืืจืื ืชืืื ืืช, ืืืชืืงืืช ืืืคืืืช Circus ืืืืชืจ
ืืืง ืืืฆืื.
ืฉืื ืืืื/ืชืืงืื ืื ืขืืงืจืืื:
ยท ืืื ืฉืืื ื ื ืืืืืื ืืืฆืข ืฉืชื ืคืงืืืืช ืกืืชืจืืช ืขื ืืืืจืจ ืื ืืื ืืช.
ยท ืืฉ ืื ื 2 ืืืืงืืช ืืจืืื ืืืฉืืช: TimedRotatingFileStream, WatchedFileStream
ยท ืืฉ ืื ื ืืืง ืืื ืืืฉ: after_spawn hook
ยท CircusPlugin ืงื ืืืชืจ ืืฉืืืืฉ
ยท fix autostart=ืฆืืคืื ืืืืืื ืืืืื ืืืชืืื (ืจืืจืกืื)
ืฉืื ืืืื ื ืืกืคืื:
ยท ื ืืชื ืื ืชื ืืืืขืืช ืงืจืงืก ื-syslog ืขืืฉืื - #748
ยท ืืคืฉืจืืช endpoint_owner ื ืืกืคื ืืื ืฉื ืืื ืืืืืืจ ืืืืื ืืฉืชืืฉ ืืฉ ืงืืฆื ืฉืงืข ipc ืฉื ืืฆืจื ืขื ืืื
ืงืจืงืก.
ยท ืืคืขืืช ืชืืืื ื-Windows (ืจืง circusctl ืืขืช ืขืชื)
ยท ืชืืงื ืืจืื ืืืืคืืช ืืืืืงืืช
ยท ืืคืฉืจ ืืฉืชื ื ืกืืืื ืชืืืื ืจืืฉืืืช
ยท ืชืืกืฃ ืืืฉืืืื ืืงืื ืืขืช ืขืจืื ืืืืจืื ืืืืืืื - #609
ยท ืืืกืฃ ืชืืืื ืืคืงืืื add ืขืืืจ ืืคืฉืจืืช 'ืกืื ืืืืื' - #767
ยท ืืืคืฉืจ ืฉืืืืช ืืืชืืช ืฉืจืืจืืชืืื ืืคืจืืืืงืืื ืฉื ืืืืื ืืืืฆืขืืช ืฉืืืจ ืืฉืืืื - #756
ยท ืืคืฉืจ ืชืฆืืจืช INI/JSON/YAML ืืจืืฉืื
ยท ืืื ืฉืื ื ืชืืืืื ื-psutil 2.x ื 3.x
ยท ืืืกืืคื ืขืื ืืืืื ืืกืคืง ืกืืืืกืืืงื - #698
ยท ืืืืื ืจืืืื ืฉืืืืจืื ืงืืืข - #731
ยท ืืคืื ืืช ืืืชืืื, ืืคืขื ืืืืฉ ืืืขื ืืืืฉ ืืืืืืืช ืืืชืจ - #673
ยท ืืชืืื ื ืืื ืฉื ืื ืงืืืฆืืช ืืฉืืืืฉ - #635
ยท ืฉืืคืืจ ืืฆืืืืช ืืืืืงืืช
ยท ืขืื ืืจืื ืืจืื ืืืจืื....
0.10 - 2013-11-04
ืฉืื ืืืื ืขืืงืจืืื:
ยท ืืขืช ืชืืื Python 3.2 ื-3.3 - #586
ยท ืืขืืืจ ืืช ืืืืื ืืืื ืืกืื ืืจืื ืืื - #569
ยท ืชืืขืื ืืฉืืคืจ - #622
ืฉืื ืืืื ื ืืกืคืื:
ยท ื ืืกืคื ืืืช ืขืฆืืจ ืืืืื ืขืฆืืจื - #594
ยท ืืื ืฉืืชืืกืฃ Watchdog ืกืืืจ ืืช ืืฉืงืขืื - #588
ยท ืขืืจ ืืื ืชื JSON ZMQ
ยท IN ืื ื ืชืื ืืื ืืคืืืคืืจืืืช - #573
ยท ืืคืฉืจ ืืืืคืืช ืกืืืื ืืืืืืืืช ืืื ืกืขืืฃ ืชืฆืืจื - #560
ยท ืืคืฉืจ ืืงืคืื ืืฉืืืช ืงืืขืื - #546
ยท ืืขืช ืืฉืชื ืื ืืืจืืืื ืืื ืืงืื ืืชืฆืืจื - #554
ยท ืืืกืืฃ ืืช ืืคืืืืื CommandReloader
ยท ื ืืกืคื ืืืื ืืคื ื_ืืืช & ืืืืจ_ืืืช
ยท ืืคืฉืจ ืืคืืืืื ืืชื ืืคืฃ ืื ืกืืช ืฉืื ืืื ืืืืืช ืืื
ยท ืื ืชืคืขืื ืืืืฉ ืชืืืืืื ืืฉืืฆืืคื ืขืืฆืจ - #529 - #536
ยท ืืืกืฃ ืืืื ืืืืืื ืืื ืืืืขืช ืืงืื - #517
ยท ืืืื ืขืืืืื ืื ืืขืช "ืืจืืฆืื" -
ยท ืชืืงื ืืช ืืชื ืืืืช ืืืืืื ืืืื ื ืืช - #515
ยท ืืื ืฉื ืืื ืืืืกืืฃ ืฆืืคืื ืื ืื ืืืืจืจ ืื ืืืคืขื - #503
ยท ืืื ืืื ืฉื ืืคืฅ ืชืืืื ืฉืคื ืชืืงืคื - #510
ยท ืืื ืฉืืคืงืืื ืืืืจ ืืืืื ืืืืืืจ ืืกืคืจ ืืืื
ยท ืชืืืื ื ืืื ื ืืฉืงืขื ipv6 - #507
ยท ืืคืฉืจ ืืคืฉืจืืืืช ืืืชืืืืช ืืืฉืืช ืขืืืจ stdout_stream ื-stderr_stream - #495
ยท ืืืกืคืช time_format ืขืืืจ FileStream - #493
ยท ื ืืกืคื ืืคืฉืจืืช ืืืฉื ืืชืฆืืจืช socket ืืื ืืืื ืืืืฉืง ืกืคืฆืืคื ืืคื ืฉื
0.9.3 - 2013-09-04
ยท ืืื ืฉื ืืื ืืืืกืืฃ ืฆืืคืื ืื ืื ืืืืจืจ ืื ืืืคืขื
ยท ืืื ืฉืื ื ืืงืคืืฆืื ืชืืืื ืฉืคื ืชืืงืคื
ยท ืืื ืฉืืคืงืืื ืืืืจ ืืืืื ืืืืืืจ ืืืื ืืื ืื ืืื
ยท ืชืืืื ื ืืื ื ืืฉืงืขื ipv6 ืืฉืืคืืจืื ืฉื CircusSockets
ยท ืชื ืขืจื ืืจืืจืช ืืืื ืื ืชืื ืืื ืืื ืืข UnboundLocalError
ยท ื ืืกืฃ ืืืืงื ืืงืืื multicast_endpoint ืืืชืืื Controller
ยท ืื ืืืืจืื ืืืชืจ ืื ืืืจืืืช ืกืคืจืืช ื-ints
ยท ืืืกืฃ ืืืื ืื
ยท ืืื ืฆืืจื ืืืงืจืื ืืืืืืื ืืขืช ืืืจืช ืืคืฉืจืืืืช stdout_stream
ยท ืงืื ืื ืืช umask ืืืืขืื ืืขืงืืืืช
ยท ืืคืฉืจ ืืคืฉืจืืืืช ืืืชืืืืช ืืืฉืืช ืขืืืจ stdout_stream ื-stderr_stream.
ยท ืืืกืฃ ืืคืฉืจืืช ืืืฉื ืืชืฆืืจืช socket ืืื ืืืื ืืืืฉืง ืกืคืฆืืคื ืืคื ืฉื
ยท ืืืกืฃ time_format ืขืืืจ FileStream + ืืืืงืืช
ยท ืขืืืื circus.upstart
0.9.2 - 2013-07-17
ยท ืืืฉืจ PYTHONPATH ืืืืืจ ืืงืืืฅ ืชืฆืืจื, ืืื ื ืืขื ื-sys.path, ืื ืฉื ืืชื ืืืื ืืืฉืชืืฉ ืื.
ืืืืงื ืฉื - #477, #481
ยท ืืฉืชืืฉ ืืืจืืืื ื ืืืื ืขืืืจ add_callback ืื ืฉืืื ืืขืืื ืขื PyZMQ < 13.1.x - ืจืื #478
0.9 - 2013-07-16
ยท ื ืืกืคื ืชืืืื ืืืืืื ืฉื ืกืขืืคืื [env]
ยท ืืืกืคื ืงืืข ืืืืืื [env]
ยท ืชืืงื ืืจืื ื ืกืชืจ ืืืฉืจ ืกืืจืงืืก-web ืืื ื ืืืชืงื - #424
ยท ืืืืื ืฉ-incr/decr ืคืงืืืืช ืืืืช ืื ื ืืช ืืืคืฉืจืืช nb - #421
ยท ืชืงื ืืืืืืช ืืชืจ ืฉื watcher virtualenv ืฉืืื ื ื-PYTHONPATH
ยท ืืื ืฉืื ื ื ืกื ืืืกืืจ ืืืชืจ ืชืืืืืื ื-0 - #429
ยท ืืขืืืื bootstrap.py - #436
ยท ืืคืจืื ืจื ืคืืืคืืจืืืช ืงืืืข ื-pythonpath virtualenv watcher
ยท ืคืื ืงืฆืืืช ืกืืืจืช ืฉืงืข ืืืืืฉืช
ยท ืืื ืฉืงืืขื Env ืืืืฉืืื ืขื ืื ืืฆืืคืื - #437
ยท ืืืกืืฃ ืืช ืืคืงืืื reloadconfig
ยท ืืืกืืคื circus.green ืืืืกืจื gevent ืืืืืื - #441, #452
ยท ืืฉืชืงืช ื ืงืืืืช ืืืืฃ ืืืืืจืืช ืืืืื ืื - #438
ยท ื ืืชื ืืืฉืชืืฉ ื$(circus.env.*) ืขืืืจ ืื ืืืคืฉืจืืืืช ืืชืฆืืจื ืืขืช
ยท ืืืกืืฃ ืืืง before_spawn
ยท ืชืงื ืืช ืื ืชืื ืฉื circusd ืืงืืืฅ ืฉืืจืืช systemd - #450
ยท ืืืืื ืฉื ืืื ืืฉื ืืช ืืืื ืืืืืืืจ ืืจืืื ืืืืฆืขืืช CLI - #455
ยท ืืกืื ืืฉืืคืจ
ยท ืืืกืืฃ ืกืืืืกืืืงืช spawn_count ื-watcher
ยท ืืืกืืคื ืคืจืืืจืื min_cpu ื-min_mem ืืชืืกืฃ ResourceWatcher
ยท ืืืกืืฃ ืืช ืคืจืื ื-FQDN ืืืืจืจ.
0.8.1 - 2013-05-28
ยท circusd-stats ื ืื ืง ืืฉืงืขื ืืื ืืงืก - #415
ยท circusd-stats & circushttpd ืชืืืืื ืืื stdout/stderr ื ืืชืจืื ืืขืช ืคืชืืืื ืืืจืืจืช ืืืื.
Python <= 2.7.5 ืืื ืง ืืืืืื ืืจืืฉืื ืืืงืจื ืฉ-2/3 ื-fds ืืืกืืจื - #415
ยท ืืขืช ืืคื ื ืื /dev/null ืืชืืืื ืืืื ืืืงืื ืกืืืจื. #417
0.8 - 2013-05-24
ยท ืฉืืืื ืืืคืื ืืืื ืื ืืืืืืช zmq io.
ยท ืืคืื ืืช ืื ืืชืื ืืืืฉ ืื ืืชื ืืืชืื ืืืขืงืืืช ืื ืืืง ืืืชืจ.
ยท ืืฉืชืืฉ ื-zmq.green.eventloop ืืืฉืจ gevent ืืืืื
ยท ื ืืกืคื ืชืืืื ืืืฉืชื ื ืืกืืืื CIRCUSCTL_ENDPOINT ื-circusctl - #396
ยท util: ืชืงื ืืื ืืคืื ืงืฆืืืช to_uid - #397
ยท ืืกืจ ืืืคื ืืฉืืืืช ioloop - #398.
ยท ืืืกืื ืืืื ืืฉืืคืจ
ยท ืืืฆืื ืืฉืืืืฉ ืืช ืืคืฉืจืืช ื'ืฉืืจืืช' ืขืืืจ ืืคืืืืื ResourceWatcher - #404
ยท ืืืกืจ ืฉืืืืฉ psutil.error
ยท ื ืืกืฃ ืชืืืืช UDP ืืงืจืงืก - #407
ยท ืืืคืฉืจ ืืขืช ืืืืืก ืืจืืืช ืกืคืจืืืช ืฉืจืืจืืชืืืช - #388
ยท ืืืกืคื ืืช ืืคืฉืจืืช ืืชืฆืืจื 'statd' - #408
ยท ืืืกืฃ ืืคืฉืจืืช pidfile, logooutput ื-loglevel ืืงืืืฅ ืืชืฆืืจื ืฉื ืืงืจืงืก - #379
ยท ื ืืกืฃ ืืืจืื ืืืกืืืื.
ยท ืืื ืฉืื ื ืืืืืื ืืช ืื ืืกืขืืคืื ืืขืช ืืฉืืืืฉ ื- include - #414
ยท ืืืกืืคื ืืคืฉืจืืืืช pipe_stdout, pipe_stderr, close_child_stderr ื-close_child_stdout ื-
ืฉืืขืืจ ืชืืืืืื
ยท ืืืกืืคื ืืคืฉืจืืืืช close_child_stderr & close_child_stdout ืืฆืืคื
0.7.1 - 2013-05-02
ยท ืชืืงื ืืช ืืคืฉืจืืช ื-respawn - #382
ยท ืืื ืฉืื ื ืืฉืชืืฉืื ื-int ืขืืืจ ืคืกืง ืืืื - #380
ยท ืืฆื ืื ืืช ืฉืงืขื ืืื ืืงืก - #381
ยท ืืื ืฉืืื ืขืืื ืขื ื-pyzmq ืืขืืื ื ืืืืชืจ
ยท ืืฆืื ืชืืืืจ ืฉื ื ืขืืืจ ืกืืืื fd
0.7 - 2013-04-08
ยท ืชืงื ืืืืื ืฉื get_arbiter ืืื ืืืฉืชืืฉ ื-dict ืืืืขืื ืืฆืืคืื. #304
ยท ืืืกืฃ ืืื ืชืืขืื ืืคืชืจืื ืืขืืืช #323
ยท ืืืกืฃ ืชืืืื ืืื ืืืช ืคืืชืื
ยท ืืกืืจื ืืช ื-givent ืืืช ืื ืืชืื ืืฉืจืฉืืจ. ืืฉืชืืฉ ืืขืช ื-ioloop - ืชืืงืื ืื ืืก' 346.
ืืชืืืืก #340
ยท circus.web ืืื ืืขืช ืคืจืืืงื ืืฉืื
ยท ืืกืืจ ืืช ืชืืงืื pyzmq
ยท ืืคืฉืจ ืืฆืืคื ืืืืืช ืืืืืจ ืื ืื ืืืคืขื #283
ยท ืืืกืฃ ืืคืฉืจืืช ืืืขืื ืช ืืืจืื ืืชืจ virtualenv
ยท ืืืกืืคื ืฆืืคืื ืืคื ืืจืืฉื
ยท ืืืกืืฃ ืืกืื ืขื nginx+websockets #371
ยท ืื ืชื ื ืืื ืืช ืจืฉืืืช ืืืคืฉืจืืืืช ืฉื ืื ืคืงืืื #369
ยท ืืืคืื ืืืืจืืขื circusd-stats ืงืืืข ืืก' 372
ยท ืชืืงื ืืช ืืขืืืช ืืืฆืคื ื-Circus-top #378
ยท ืขืื ืืจืื ืืืจืื...
0.6 - 2012-12-18
ยท ืฉื ืคืจืืืืงืืื ืชืืงืื ืขืืืจ ืฉืงืขืื - #248
ยท ืืื ืืืฆืข ืงื ื ืืืื ืืืืืืื ืฉื ืืจืคืื. #240
ยท circusctl: ืืืกืฃ ืืขืืจื ืืคื ืคืงืืื, ื-docstrings #217
ยท ื ืืกืคื ืืื ืขืืืืื
ยท ื ืืกืคื ืืืืืช ืืืืื - #227
ยท ื ืืกืฃ Redis, HTTP Observer, ื ืชืื ืื ืกืืืืกืืืื ืืืืื ืืชืืกืคื ืืฉืืืื
ยท ืืขืช ืืชืืืืืื ืืืืืื ืืืืืช ืืืชืจืืช
ยท ืืฉืืื ืืืืืืืืช ื ืืกืคื
ยท ื ืืกืฃ ืชืืืื/ืืื ืฆืืคื ื-webui
ยท ื ืืกืคื ืชืืืื ืืื ืืจืช SSH
ยท ืืขืช ืืืืฆืขืืช pyzmq.green
ยท ื ืืกืฃ ืกืงืจืืคื upstart & ืืื doc
ยท ื ืืกืคื ืืฉืชื ื ืกืืืื ืืงืืขืื
ยท ื ืืกืคื ืชืืืื ืืฉืงืขื ืืื ืืงืก
ยท ืืืกืืฃ ืืช respawn ืืคืฉืจืืช ืืืืืืง ืฆืืคืื ืืจืืฆื ืืืช
ยท ืืขืช ืืฉืชืืฉืื ืืจืขืื ืืืืืงืืช
ยท ืืคืฉืจ ืืืืคืช ืฉืงืขืื ื-args
ยท ื ืืฉื ืืืฉ ืืืกืื
ยท ืืคืฉืจืืืืช ืกืืืื ืืืฉืืช ืืืจืืื: max_bytes/backup_count
0.5.2 - 2012-07-26
ยท ืืขืช ืืชืงื ืืช ืืืืื ืืฉืจืฉืืจ ืื-stdlib ืืื ืืื ืืข ืืื ืืืืื ืฉื Python - #203
ยท ืืกื ืขืืจื circusctl ื ืจืื ืืื ืืืชืจ
ยท ืืฉืชืืฉ ื-pustil get_nice() ืืืฉืจ ืืืื (ื ืืื ืืืฆื ืืฉืืืืฉ) - #208
ยท ืืืกืคืช ืชืืืืช max_age - #221
ยท ืืชืงืฉืจ ืจืง ืืืืื ื() ืืฉืงืขื SOCK_STREAM ืื SOCK_SEQPACKET
ยท ืืื ืฉืืืงืจ ืืจืืงื ืืช ืจืฉืืืช ืืชืืกืคืื ื-update_watchers() - #220
ยท ืืืกืืฃ --log-level ื --log-output ื-circushttpd
ยท ืืชืงื ืืช ืืจื ืืชืืืื ืืืืฆืขืืช ืืืฉืง ืืืฉืชืืฉ ืืืื ืืจื ื - #219
ยท ืืขืช circus ืชืืื zc.buildout ืืชืกืจืืืื.
ยท ื ืงื ืืช ื-websocket ืืืฉืจ ืืืงืื ืืชื ืชืง - #225
ยท ืชืืงื ืืช ืขืจื ืืจืืจืช ืืืืื ืขืืืจ ื ืงืืืช ืืงืฆื - #199
ยท ืืคืืฆื circushttpd ืืืืืืืื ืืืืืื
0.5.1 - 2012-07-11
ยท ืชืืงื ืืกืคืจ ืฉืืืืืช ืืงืืื ืืชืืขืื
ยท ื ืืกืคื ืืคืฉืจืืช ื ืืคืื ืืืืื
ยท ืืจืื ืืช web-requirements.txt ืืจืืื
ยท ืืืกืฃ ืงืื ืฉืืืื ืืืืืขืืช - ืชืืงืื ืื #111
0.5 - 2012-07-06
ยท ืืืกืคืช ืชืืืืช ืฉืงืขืื
ยท ืืืกืืฃ ืคืงืืืช listsocket
ยท ืื ืืฉืงืขืื ืืฉ ื ืชืื ืื ืกืืืืกืืืื!
ยท ืชืืงื ื ืืจืื ืืืืื ืงืื ืื
ยท ืืกืืจ ืืช ื-wid - ืืขืช ืืฉืชืืฉ ื-Pid ืืื ืืงืื
ยท ืืืืงืืช ืืืืจืืช ืืืชืจ
ยท ืฉืื ื ืืช ืชืืืืจ ืืืฉืชื ืื
ยท ืืฉืชืืฉ ื-ioloop ืฉื pyzmq ืืืงืืืืช ื ืืกืคืื
ยท ืืฉืชืืฉ ืืขืช ื-iowait ืขืืืจ ืื ืืงืจืืืืช select()
ยท ืืคืงืืืืช incr/decr ืืฉ ืืขืช ืคืจืืืจ nbprocess
ยท ืืืกืฃ ืืคืฉืจืืช reproduce_env ืืฆืืคืื
ยท ืืืกืฃ ืกืืืืก ืื ืงืืื ืืืฉ ืืชืืืืืื
ยท ืืืกืืฃ ืืช ืืืืืืื httpd ืืคืฉืจืืช ืืืคืขืื circushttpd ืืฆืืคื
0.4 - 2012-06-12
ยท ื ืืกืคื ืืขืจืืช ืคืืืืื
ยท ื ืืกืคื ืืคืฉืจืืช "ืกืื ืืืืื" ืืฆืืคืื
ยท ืืืืื ืืกื ืขืืืื ืงืจืงืก ืงืืืข
ยท ืืกืืจื ืฉืจืฉืืจืื ื-circus.stats ืืืืืช ืืชืงืฉืจืืืืช ืชืงืืคืชืืืช ืฉื zmq
ยท ืฉืืคืจ ืืช ืืชืืขืื
ยท ืืืงืื Circus ืืฉ ืืขืช ืืืฉืง API ืฉื send_message
ยท ืืชืืื ื ืืืชื ืืคืคืช ืืื ืืขืช ืชืืกืฃ
ยท ืืื ืืื ืฉืืจืช ืคืงืืื ืืฉ โโืืคืฉืจืืช --version
ยท ื ืืกืฃ ืชืืกืฃ statsd (ืฉืืื ืืช ืืืืจืืขืื ืืงืจืงืก ื-statsd)
ยท ืืืฉืง ืืืฉืชืืฉ ืฉื ืืืื ืืจื ื ืืฉืชืืฉ ืืขืช ื-websockets (ืืจื socketio) ืืื ืืงืื ืืช ืื ืชืื ืื ืืกืืืืกืืืื
ยท ืืืฉืง ืืืฉืชืืฉ ืฉื ืืืื ืืจื ื ืืฉืชืืฉ ืืขืช ืืืคืขืืืช ืขืืืจ "ืืืืขืืช ืืืืง" ืืืืฉืง ืืืื ืืจื ื
0.3.4 - 2012-05-30
ยท ืชืืงื ืืฆื ืืืจืืฅ ืฉืื ืข ืืืืงืจ ืืงืฆืืจ ืืฆืืจื ื ืงืืื ืชืืืืืื ืฉืืกืชืืืื.
ยท ืืขืช ื ืืชื ืืฉืืื ื-check_flapping ืืชืฆืืจื. ืืืืคืขื/ืืืฉืืช
ืืื ืฆืืคื.
0.3.3 - 2012-05-29
ยท ืชืืงื ืืช ืืจืืจืกืื ืืืืคืื ื-uid
0.3.2 - 2012-05-24
ยท ืืืคืฉืจ ืืืคืืื args ืืืคืฆืืื ืื ืืคืงืืื add_watcher.
ยท ืืืกืืฃ circushttpd, circus-top ื-circusd-stats
ยท ืืืคืฉืจ ื-Arbiter.add_watcher() ืืืืืืจ ืืช ืื ืืืคืฉืจืืืืช Watcher
ยท ืืืืื ืฉืืืคื ืื ืืืืฉ ื ืืฆืจื ืืืืฉ ืืืคืขืื ืืืืฉ
0.3.1 - 2012-04-18
ยท ืชืืงืื: ืืื ืฉืืจืืจืืช ืืืืื ืฉื ืืฆืืคื ืืื ื ืขืืงืคืืช
ยท ืืืกืืฃ ืืืชืช StdoutStream.
0.3 - 2012-04-18
ยท ืืืกืืฃ ืืช ืชืืื ืช ืืกืืจืืืื ื
ยท ืืฆืื ืืขืช ืืืกืื ืืืกืื ืืกืคืื ืงืก
ยท ืชืืงื ืืช ืืืจื ืฉืื ืืชืืืืืื ืืืืชืื (ืื ืขืื SIGQUIT)
ยท ืืชืฆืืจื ื ืืงืื ืืืฉืืื
ยท ืชืืืื ื-setproctitle
0.2 - 2012-04-04
ยท ืืกืืจ ืืช ืึฐืึทืฆึดืื ืฉืึตื. ืืืืืฃ ืขื ืืื ืฆืึนืคึถื.
ยท ื ืืกืคื ืชืืืื ืืชืืืื ืืืืืจื rlimit.
ยท ื ืืกืคื ืชืืืื ืขืืืจ include dirs ืืงืืืฅ ืืชืฆืืจื.
ยท ืชืืงื ืืื ืืชืืจื ืงืืฆืื ืืืืคืื.
ยท ืชืืงื ืืืืื ืฉื ืืืื ืื ืคื ืืฃ
ยท ืฉืืคืืจื ืืกืื
ยท ืืื ืฉืืืืืช circusd ืืจืืื ืืืฉืจ circusd ืืืจ ืคืืขื ืขื ืืืชื ืฉืงืข.
ยท get_arbiter ืืงืื ืืขืช ืืกืคืจ ืฆืืคืื.
ยท ืชืืงื ืืช cmd vs args vs executable ืืชืืืื init.
ยท ืงืืืข - ืืชืื ื-circusctl ืืืืกืืฃ
0.1 - 2012-03-20
ยท ืฉืืืจืืจ ืจืืฉืื ื
ืืืฉ ืืคืื
ืงืจืงืก ืืืฉ ืขืืื
ืชึทืงืฆึดืืจ
circusd [ืืคืฉืจืืืืช] [config]
ืชืืืืจ
circusd ืืื ืืชืืืื ืืขืืงืจื ืฉื ืืจืืืืงืืืจืช ืืงืจืงืก. ืื ืืืื ืืืคืขืื ืืช ืื
ืชืืืืืื. ืื ืชืืืื ืืื ืืื ืขื ืืื ืงืจืงืก ืืื ืชืืืื ืืื ืฉื ืงืจืงืก.
ืืืขืื ืื
config ืงืืืฅ ืชืฆืืจื
ืืคืฉืจืืืืช
-ื, - ืขืืจื
ืืฆื ืืช ืืืืขืช ืืขืืจื ืืฆื
--ืจืืช ืืืื ืจืื
ืฆืืื ืืช ืจืืช ืืืืื. ืจืื ืืืื ืืืืืช ืืืืข, ืืืืื, ืงืจืืื, ืืืืจื or ืฉืืืื.
--ืคืื ืืืื LOGOUTPUT
ืืืืงืื ืื ืืืืชืื ืืืืื ืื. ืืชื ืืืืช ืืจืืจืช ืืืืื ืืื ืืืชืื ืื
stdout (ืชืืื ืืืืฅ ืืืชื ืขื ืืื ืืขืืจืช '-' ืืืคืฉืจืืช ืื). ืืืงื ืฉื ืงืืืฅ
ืืืจืช.
--logger-config LOGGERCONFIG
ืืืืงืื ืฉืื ืงืืืฅ Python ืืืืจ ืชืฆืืจืช INI, JSON ืื YAML
ืืืื ืืืืฆื. ื ืืชื ืืืฉืชืืฉ ืืื ืืื ืืขืงืืฃ ืืช ืชืฆืืจืช ืจืืฉืื ืืจืืจืช ืืืืื ืขืืืจ
ืืืืจืจ.
--ืืืืื
ืืชืื ืงืจืงืก ืืจืงืข.
--pidfile PIDFILE
ืืืืงืื ืฉื ืงืืืฅ ื-PID.
--ืึดืจึฐืกึธื
ืืฆืื ืืช ืืจืกืช ืืงืจืงืก ืืืฆืืืืช.
ืึดืจึฐืืึนืช ืื
ืงืจืงืก (1), circusctl (1), ืกืืืืกืืืงืืช ืงืจืงืก (1), ืงืจืงืก-ืคืืืืื (1), ืืืค ืงืจืงืก (1).
ืืชืืขืื ืืืื ืืืื ืืืชืืืช http://circus.readthedocs.org
circusctl ืืืฉ ืขืืื
ืชึทืงืฆึดืืจ
ืืคืงืืื circusctl [ืืคืฉืจืืืืช] [args]
ืชืืืืจ
circusctl ืืื ืืงืฆื ืืงืืื ืืฉืืืื ืืืืื ืืงืจืงืก. ืื ื ืืขื ืืขืืืจ ื
ืืื ืื ืฉืืื ืืชืคืงืื ื-Circud ืงืจืงืก ืืืื.
ืคืงืืืืช
ืืืืกืืฃ ืืืกืฃ ืฆืืคื
decr ืืงืื ืช ืืกืคืจ ืืชืืืืืื ืืฆืืคื
dstats ืงืืื ืกืืืืกืืืงืืช ืฉื ืงืจืงืก
ืืงืื ืงืื ืืช ืืขืจื ืฉื ืืคืฉืจืืืืช ืฆืืคื ืกืคืฆืืคืืืช
ืืืคืฆืืืช ืืืืืืืืช
ืงืื ืืช ืืคืฉืจืืืืช ืืืืจืจ
ืชืืกืคืช ืืืื ืืช ืืกืคืจ ืืชืืืืืื ืืฆืืคื
ืคึผึดืืชืึนื
ืฆืืจ ืืขืืคืช ืืชืืืื ืืงืจืงืก
ืจืฉืืื ืงืื ืจืฉืืื ืฉื ืฆืืคืื ืื ืชืืืืืื ืืฆืืคื
ืืืงืฉืื ืืืจืฉื ืืืืจืืข ืฆืืคื
ืฉืงืขื ืจืฉืืืืช
ืงืืื ืืช ืจืฉืืืช ืืฉืงืขืื
ืืกืคืจ ืชืืืืืื
ืงืื ืืช ืืกืคืจ ืืชืืืืืื
ืฉืืืจื ืืกืคืจ
ืงืื ืืช ืืกืคืจ ืืฆืืคืื
ืืคืฉืจืืืืช
ืงืื ืืช ืืขืจื ืฉื ืื ืืืคืฉืจืืืืช ืขืืืจ ืฆืืคื
ืืืคืกืืง ืขืืื ืืช ืืืืจืจ ืืื
ืืืขืื ืืืืฉ ืืขื ืืืืฉ ืืช ืืืืจืจ ืื ืฆืืคื
ืืขื ืืืืฉ ืืช ืืชืฆืืจื
ืืขื ืืืืฉ ืืช ืงืืืฅ ืืชืฆืืจื
ืืคืขืื ืืืืฉ
ืืคืขื ืืืืฉ ืืช ืืืืจืจ ืื ืฆืืคื
rm ืืกืจ ืฆืืคื
ืกื ืืืืจ ืืคืฉืจืืช ืฆืืคื
ืืึนืช ืฉืื ืืืช
ืืชืืื ืืชืื ืืช ืืืืจืจ ืื ืฆืืคื
ืกืืืืกืืืงืืช ืงืื ืืืืข ืขื ืชืืืื
ืืฆื ืงืื ืกืืืืก ืฉื ืฆืืคื ืื ืื ืืฆืืคืื
ืืืคืกืืง ืฉืืืจื ืขืฆืืจ
ืืคืฉืจืืืืช
--ื ืงืืืช ืงืฆื ืกืืื
ื ืงืืืช ืงืฆื ืืืืืจ
-ื, - ืขืืจื
ืืฆื ืืช ืืืืขืช ืืขืืจื ืืฆื
--json ืคืื ื-JSON
--ืึฐืึทืคึผืึนืช
ืืืืคืืช ืคืื
--ืฉืฉ SSH
ืฉืจืช SSH ืืคืืจืื user@host:port
--ssh_keyfile SSH_KEYFILE
ื ืชืื ืืงืืืฅ ืืืคืชื ืืื ืืืฉืจ ืืช ืืืฉืชืืฉ
--ืคืกืง ืืื ืคืกืง ืืื
ืคืกืง ืืื ืืืืืืจ
--ืึดืจึฐืกึธื
ืืฆืื ืืช ืืจืกืช ืืงืจืงืก ืืืฆืืืืช.
ืึดืจึฐืืึนืช ืื
ืงืจืงืก (1), ืงืจืงืก (1), ืกืืืืกืืืงืืช ืงืจืงืก (1), ืงืจืงืก-ืคืืืืื (1), ืืืค ืงืจืงืก (1).
ืืชืืขืื ืืืื ืืืื ืืืชืืืช http://circus.readthedocs.org
ืงืจืงืก-ืคืืืืื ืืืฉ ืขืืื
ืชึทืงืฆึดืืจ
circus-plugin [ืืคืฉืจืืืืช] [plugin]
ืชืืืืจ
circus-plugin ืืืคืฉืจ ืืืคืขืื ืชืืกืฃ ืืืืื Circus ืคืืขื.
ืืืขืื ืื
ืืืืืจ ืฉื ืืื ืฉื ืืืืงืช ืืคืืืืื.
ืืคืฉืจืืืืช
--ื ืงืืืช ืงืฆื ืกืืื
ื ืงืืืช ืงืฆื ืืืืืจ.
--pubsub PUBSUB
ืฉืงืข ืืคืื/ืกืื circusd ZeroMQ ืืืชืืืจ ืืืื.
--config ืืชืฆืืจื
ืงืืืฅ ืืชืฆืืจื ืฉื ืืคืืืืื.
--ืขืืืื ืืืืงื CHECK_DELAY
ืืืืง ืขืืืื.
--ืจืืช ืืืื ืจืื
ืฆืืื ืืช ืจืืช ืืืืื. ืจืื ืืืื ืืืืืช ืืืืข, ืืืืื, ืงืจืืื, ืืืืจื or ืฉืืืื.
--ืคืื ืืืื LOGOUTPUT
ืืืืงืื ืื ืืืืชืื ืืืืื ืื. ืืชื ืืืืช ืืจืืจืช ืืืืื ืืื ืืืชืื ืื
stdout (ืชืืื ืืืืฅ ืืืชื ืขื ืืื ืืขืืจืช '-' ืืืคืฉืจืืช ืื). ืืืงื ืฉื ืงืืืฅ
ืืืจืช.
--ืฉืฉ SSH
ืฉืจืช SSH ืืคืืจืื user@host:port.
-ื, - ืขืืจื
ืืฆื ืืช ืืืืขืช ืืขืืจื ืืฆื.
--ืึดืจึฐืกึธื
ืืฆืื ืืช ืืจืกืช ืืงืจืงืก ืืืฆืืืืช.
ืึดืจึฐืืึนืช ืื
ืงืจืงืก (1), ืงืจืงืก (1), circusctl (1), ืกืืืืกืืืงืืช ืงืจืงืก (1), ืืืค ืงืจืงืก (1).
ืืชืืขืื ืืืื ืืืื ืืืชืืืช http://circus.readthedocs.org
ืืืค ืงืจืงืก ืืืฉ ืขืืื
ืชึทืงืฆึดืืจ
ืจืืฉ ืงืจืงืก [ืืคืฉืจืืืืช]
ืชืืืืจ
ืงืจืงืก-ืืืค ืืื ื ืืืง ืขืืืืืคืงืืื -like ืืืฆืืช ืืืื ืืงืจืงืก ืืืชืืืืืื ืืื ืืืืื ืขื ืืื
ืงืจืงืก.
ืืคืฉืจืืืืช
--ื ืงืืืช ืงืฆื ืกืืื
ื ืงืืืช ืงืฆื ืืืืืจ.
--ืฉืฉ SSH
ืฉืจืช SSH ืืคืืจืื user@host:port.
--ืืื ืงืฆืื ืืชืืืื PROCESS_TIMEOUT
ืืืืจ ืขืืืื ืื ืฉื ืืืกืจ ืคืขืืืืช, ืชืืืื ืืืกืจ.
-ื, - ืขืืจื
ืืฆื ืืช ืืืืขืช ืืขืืจื ืืฆื.
--ืึดืจึฐืกึธื
ืืฆืื ืืช ืืจืกืช ืืงืจืงืก ืืืฆืืืืช.
ืึดืจึฐืืึนืช ืื
ืงืจืงืก (1), circusctl (1), ืงืจืงืก (1), ืกืืืืกืืืงืืช ืงืจืงืก (1), ืงืจืงืก-ืคืืืืื (1).
ืืชืืขืื ืืืื ืืืื ืืืชืืืช http://circus.readthedocs.org
ืกืืืืกืืืงืืช ืงืจืงืก ืืืฉ ืขืืื
ืชึทืงืฆึดืืจ
circusd-stats [ืืคืฉืจืืืืช]
ืชืืืืจ
circusd-stats ืืคืขืื ืืช ืืืจืืืืจ ืื ืชืื ืื ืืกืืืืกืืืื ืขืืืจ Circus.
ืืคืฉืจืืืืช
--ื ืงืืืช ืงืฆื ืกืืื
ื ืงืืืช ืงืฆื ืืืืืจ.
--pubsub PUBSUB
ืฉืงืข ืืคืื/ืกืื circusd ZeroMQ ืืืชืืืจ ืืืื.
--statspoint STATSPOINT
ืฉืงืข ืืคืื/ืืฉื ื ZeroMQ ืืฉืืื ืืืื ื ืชืื ืื.
--ืจืืช ืืืื ืจืื
ืฆืืื ืืช ืจืืช ืืืืื. ืจืื ืืืื ืืืืืช ืืืืข, ืืืืื, ืงืจืืื, ืืืืจื or ืฉืืืื.
--ืคืื ืืืื LOGOUTPUT
ืืืืงืื ืื ืืืืชืื ืืืืื ืื. ืืชื ืืืืช ืืจืืจืช ืืืืื ืืื ืืืชืื ืื
stdout (ืชืืื ืืืืฅ ืืืชื ืขื ืืื ืืขืืจืช '-' ืืืคืฉืจืืช ืื). ืืืงื ืฉื ืงืืืฅ
ืืืจืช.
--ืฉืฉ SSH
ืฉืจืช SSH ืืคืืจืื user@host:port.
-ื, - ืขืืจื
ืืฆื ืืช ืืืืขืช ืืขืืจื ืืฆื.
--ืึดืจึฐืกึธื
ืืฆืื ืืช ืืจืกืช ืืงืจืงืก ืืืฆืืืืช.
ืึดืจึฐืืึนืช ืื
ืงืจืงืก (1), ืงืจืงืก (1), circusctl (1), ืงืจืงืก-ืคืืืืื (1), ืืืค ืงืจืงืก (1).
ืืชืืขืื ืืืื ืืืื ืืืชืืืช http://circus.readthedocs.org
ืืืืื ืืื ืืื: ืกืคืฆืืคื ืืงืจืงืก ืืื ืืื
ืคืืกืง
ืืฉืืืื ืคืืกืง ืืืจืื ืขื ื ืืืื ืื ืืฆืืคืื ืืงืจืงืก, ืืืืืื
ืื ืืชืืืืืื ืคืืขืืื ืืืืื.
ืืงืจ
A ืืงืจ ืืืื ืืช ืืืืื ืืคืขืืืืช ืฉื ืืชื ืืืฆืข ืขื ืืืืจืจ.
ืืชื ืคื ืฃ
ืืฉืืืื ืืชื ืคื ืฃ ืืืืื ื ืจืฉื ืืืืจืืขืื ืืืืื ืืชื ืชืืืืืื ืืกืืืืื
ืื ืืืื ืืืืฉ.
ืคืื/ืชืช
ืืงืจืงืก ืืฉ ื pubsub ืฉืืงืื ืืืจืืขืื ืืืฆืืคืื ืืฉืืื ืืืชื ืืืืื
ืื ืืื ืืืื.
ืืจืืืง ืืงืจ
ืืฉืืืื ืืจืืืง ืืงืจ ืืืคืฉืจ ืื ืืชืงืฉืจ ืขื ืืืงืจ ืืืืฆืขืืช ZMQ ื
ืืฉืืื ืืงืจืงืก.
ืฆืึนืคึถื, ืฆืืคืื
A ืฆืึนืคึถื ืืื ืืชืืื ืืช ืฉืืชื ืืืืจ ืืงืจืงืก ืืืคืขืื. ืืืคืข ืืืื ืฉื Circus ืืืื ืืคืขืื
ืฆืืคื ืืื ืื ืืืชืจ.
ืขืึนืึตื, ืขืืืืื, ืชึทืึฒืึดืื, ืชืืืืืื
A ืชืืืื ืืื ืืืคืข ืขืฆืืื ืฉื ืชืืืื ืืขืจืืช ืืคืขืื ืฉื ืืชืืื ืืช ืฉืื. ืฆืืคื ืืืื
ืืืื ืืืคืขืื ืชืืืื ืืื ืื ืืืชืจ. ืื ืื ื ืงืืจืืื ืืื ืื ืขืืืืื.
ืืืืืืช ืืืฆืจืื
Circus ืืืงื ืขื ืืื Tarek Ziade ืืืื ืืืจืฉื ืชืืช APLv2
ืื ืืื ืฆ'ืกื ื ืืื ืชืืจื ืืืงืื ืืขืฉื ืืืจืื ืจืืื, ืืื ืจืื ืืคืขืืืืช
circus.commands ืขืืืื.
ืจืืฉืืื
ืืืืืืช ืืืฆืจืื 2012 - ืงืจื ืืืืืื
ืืืืืืช ืืืฆืจืื 2012 - ืื ืืื ืฆ'ืกื ื
ืืืจืฉื ืืจืืฉืืื ืืคืืฆ'ื, ืืจืกื 2.0 ("ืืจืืฉืืื");
ืืื ื ืจืฉืื ืืืฉืชืืฉ ืืงืืืฅ ืื ืืื ืจืง ืืืชืื ืืจืืฉืืื.
ืืชื ืืืื ืืืฉืื ืขืืชืง ืฉื ืืจืืฉืืื ืืืชืืืช
http://www.apache.org/licenses/LICENSE-2.0
ืืื ืื ืื ื ืืจืฉ ืขื ืคื ืืืืง ืืื ืื ืืืกืื ืืืชื, ืชืืื ื
ืืืืคืฅ ืชืืช ืืจืืฉืืื ืืืคืฅ ืขื ืืกืืก "ืืคื ืฉืืื",
ืืื ืืืจืืืช ืื ืชื ืืื ืืื ืกืื ืฉืืื, ืืคืืจืฉ ืื ืืฉืชืืข.
ืขืืื ืืจืืฉืืื ืืงืืืช ืืฉืคื ืืกืคืฆืืคืืช ืืืกืืืจื ืืช ืืืจืฉืืืช
ืืืืืืช ืชืืช ืืจืืฉืืื.
ืชืืจื
ืจืื ืืช ืืจืฉืืื ืืืืื ื https://github.com/circus-tent/circus/blob/master/CONTRIBUTORS.txt
ืืฉืชืืฉ ืืงืจืงืก ืืืื ืืจื ื ืืืืฆืขืืช ืฉืืจืืชื onworks.net