summaryrefslogtreecommitdiffstats
path: root/einhyrningsins.1.html
diff options
context:
space:
mode:
Diffstat (limited to 'einhyrningsins.1.html')
-rw-r--r--einhyrningsins.1.html190
1 files changed, 190 insertions, 0 deletions
diff --git a/einhyrningsins.1.html b/einhyrningsins.1.html
new file mode 100644
index 0000000..10f54ff
--- /dev/null
+++ b/einhyrningsins.1.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv='content-type' value='text/html;charset=utf8'>
+ <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
+ <title>einhyrningsins(1) - graceful restarts for socket-based daemons</title>
+ <style type='text/css' media='all'>
+ /* style: man */
+ body#manpage {margin:0}
+ .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
+ .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
+ .mp h2 {margin:10px 0 0 0}
+ .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
+ .mp h3 {margin:0 0 0 4ex}
+ .mp dt {margin:0;clear:left}
+ .mp dt.flush {float:left;width:8ex}
+ .mp dd {margin:0 0 0 9ex}
+ .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
+ .mp pre {margin-bottom:20px}
+ .mp pre+h2,.mp pre+h3 {margin-top:22px}
+ .mp h2+pre,.mp h3+pre {margin-top:5px}
+ .mp img {display:block;margin:auto}
+ .mp h1.man-title {display:none}
+ .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
+ .mp h2 {font-size:16px;line-height:1.25}
+ .mp h1 {font-size:20px;line-height:2}
+ .mp {text-align:justify;background:#fff}
+ .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
+ .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
+ .mp u {text-decoration:underline}
+ .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
+ .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
+ .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
+ .mp b.man-ref {font-weight:normal;color:#434241}
+ .mp pre {padding:0 4ex}
+ .mp pre code {font-weight:normal;color:#434241}
+ .mp h2+pre,h3+pre {padding-left:0}
+ ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
+ ol.man-decor {width:100%}
+ ol.man-decor li.tl {text-align:left}
+ ol.man-decor li.tc {text-align:center;letter-spacing:4px}
+ ol.man-decor li.tr {text-align:right;float:right}
+ </style>
+ <style type='text/css' media='all'>
+ /* style: toc */
+ .man-navigation {display:block !important;position:fixed;top:0;left:113ex;height:100%;width:100%;padding:48px 0 0 0;border-left:1px solid #dbdbdb;background:#eee}
+ .man-navigation a,.man-navigation a:hover,.man-navigation a:link,.man-navigation a:visited {display:block;margin:0;padding:5px 2px 5px 30px;color:#999;text-decoration:none}
+ .man-navigation a:hover {color:#111;text-decoration:underline}
+ </style>
+</head>
+<!--
+ The following styles are deprecated and will be removed at some point:
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
+
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
+ .man-navigation should be used instead.
+-->
+<body id='manpage'>
+ <div class='mp' id='man'>
+
+ <div class='man-navigation' style='display:none'>
+ <a href="#NAME">NAME</a>
+ <a href="#SYNOPSIS">SYNOPSIS</a>
+ <a href="#DESCRIPTION">DESCRIPTION</a>
+ <a href="#CHILD-API">CHILD API</a>
+ <a href="#HISTORY">HISTORY</a>
+ <a href="#STATUS">STATUS</a>
+ <a href="#COPYRIGHT">COPYRIGHT</a>
+ <a href="#SEE-ALSO">SEE ALSO</a>
+ </div>
+
+ <ol class='man-decor man-head man head'>
+ <li class='tl'>einhyrningsins(1)</li>
+ <li class='tc'></li>
+ <li class='tr'>einhyrningsins(1)</li>
+ </ol>
+
+ <h2 id="NAME">NAME</h2>
+<p class="man-name">
+ <code>einhyrningsins</code> - <span class="man-whatis">graceful restarts for socket-based daemons</span>
+</p>
+
+<h2 id="SYNOPSIS">SYNOPSIS</h2>
+
+<p><code>einhyrningsins</code> [<var>OPTIONS</var>] [--] <var>PROGRAM</var> [<var>PROGRAM_ARGS</var>]</p>
+
+<h2 id="DESCRIPTION">DESCRIPTION</h2>
+
+<p><code>Einhyrningsins</code> is a socket multiplexer featuring graceful restarts. It runs
+multiple copies of a child program, each of which are passed a shared socket
+(or multiple shared sockets) to <span class="man-ref">bind<span class="s">(2)</span></span> to and <span class="man-ref">accept<span class="s">(2)</span></span> connections from.
+Graceful, rolling restarts enable updates of the child program with zero
+downtime and no dropped connections.</p>
+
+<p>This program requires special support in the child program to achive the
+graceful restarts (aka, exiting only after all connection close) and to be able
+to bind to inherited file descriptors (as indicated by environment variables).
+Child programs must also be able to run in parallel: for example, each copy
+must not try to write to the same output file without some form of locking.</p>
+
+<ul>
+<li><p><code>-n</code>, <code>--number</code> <var>COUNT</var>:
+How many child processes to spawn.</p></li>
+<li><p><code>-b</code>, <code>--bind</code> <var>ADDR</var>:<var>PORT</var>[,<var>OPT</var>...]:
+Socket(s) to bind to. <var>OPT</var> specifies flags to be set on the socket. Options
+are <code>n</code> for non-blocking (<code>O_NONBLOCK</code>) and <code>r</code> for re-using addresses
+(<code>SO_REUSEADDR</code>). Eg, for both options, could pass <code>-b 127.0.0.1:1234,r,n</code>.
+This argument can be repeated.</p></li>
+<li><p><code>-4</code>, <code>--ipv4-only</code>:
+Only accept IPv4 connections</p></li>
+<li><p><code>-6</code>, <code>--ipv6-only</code>:
+Only accept IPv6 connections</p></li>
+<li><p><code>-h</code>, <code>--help</code>:
+Print a help menu</p></li>
+<li><p><code>--version</code>:
+Print program version</p></li>
+<li><p><code>-v</code>, <code>--verbose</code>:
+More verbose logging and output</p></li>
+<li><p><code>--syslog</code>:
+Enables logging via <span class="man-ref">syslog<span class="s">(2)</span></span> (for WARN and above).</p></li>
+<li><p><code>-m</code>, <code>--manual</code>:
+Enable manual (explicit) acknowledge mode, in which each child program must
+connect to the master's control socket and "ACK" within a graceperiod, or it
+will be considered unhealthy and get restarted.</p></li>
+<li><p><code>--drop-env-var</code> <var>VAR</var>:
+Clears the given variable from the child's environment. All other variables
+are passed through by default. This argument can be repeated.</p></li>
+<li><p><code>-d</code>, <code>--socket-path</code> <var>PATH</var>:
+Where to create the control socket (default: <code>/tmp/einhorn.sock</code>).</p></li>
+<li><p><code>-r</code>, <code>--retries</code> <var>COUNT</var>
+How many times to attempt re-spawning before giving up.</p></li>
+</ul>
+
+
+<h2 id="CHILD-API">CHILD API</h2>
+
+<p><code>Einhyrningsins</code> creates children by <span class="man-ref">fork<span class="s">(1)</span></span>-ing a new process and
+<span class="man-ref">execve<span class="s">(1)</span></span>-ing to run the proces itself. For every socket specified by a <code>-b</code>
+flag, a socket is bound in the main <code>einhyrningsins</code> process and then
+explicitly flagged to be passed on to the child processes. This means the child
+process will already have a valid file descriptor bound to each of the shared
+sockets. The file descriptor numbers are passed via the following environment
+variables:</p>
+
+<dl>
+<dt><code>EINHORN_FD_COUNT</code></dt><dd>How many sockets have been passed.</dd>
+<dt><code>EINHORN_FD_&lt;NUM></code></dt><dd>One evironment for each socket with <var>NUM</var> from 0 to <code>EINHORN_FD_COUNT-1</code>.</dd>
+</dl>
+
+
+<p>When <code>einhyrningsins</code> is run in manual mode, each child process should connect
+to the control socket (at the UNIX path given by the <code>EINHORN_SOCK_PATH</code>
+variable) and <span class="man-ref">write<span class="s">(2)</span></span> a newline-terminated string like the following,
+containing the child's PID number:</p>
+
+<p> <code>{"command":"worker:ack", "pid":&lt;PID>}</code></p>
+
+<h2 id="HISTORY">HISTORY</h2>
+
+<p><code>Einhyrningsins</code> is a partially-comparible re-implementation of <a class="man-ref" href="https://github.com/stripe/einhorn">einhorn<span class="s">(1)</span></a> (a
+Ruby program) in Rust. Einhorn itself derived from Unicorn.</p>
+
+<p>The word "Einhyrningsins" is Icelandic for unicorn.</p>
+
+<h2 id="STATUS">STATUS</h2>
+
+<p><code>Einhyrningsins</code> is a for-fun hobby project. It is not feature complete, fully
+documented, or tested.</p>
+
+<h2 id="COPYRIGHT">COPYRIGHT</h2>
+
+<p>Copyright 2016 Bryan Newbold
+License GPLv3+: GNU GPL version 3 or later <a href="http://gnu.org/licenses/gpl.html" data-bare-link="true">http://gnu.org/licenses/gpl.html</a>.
+This is free software: you are free to change and redistribute it. There is NO
+WARRANTY, to the extent permitted by law.</p>
+
+<h2 id="SEE-ALSO">SEE ALSO</h2>
+
+<p><a class="man-ref" href="https://github.com/stripe/einhorn">einhorn<span class="s">(1)</span></a>, <a class="man-ref" href="einhyrningsinsctl.1.html">einhyrningsinsctl<span class="s">(1)</span></a>, <span class="man-ref">socket<span class="s">(7)</span></span></p>
+
+
+ <ol class='man-decor man-foot man foot'>
+ <li class='tl'></li>
+ <li class='tc'>October 2016</li>
+ <li class='tr'>einhyrningsins(1)</li>
+ </ol>
+
+ </div>
+</body>
+</html>