the-shepherd
Version:
Control a herd of wild processes.
203 lines (133 loc) • 8.23 kB
Markdown
The Shepherd
--------
Manage groups of processes.
Install:
`npm install the-shepherd`
Usage:
`shep <command> [options]`
Global options:
--quiet or -q
--verbose or -v
--force or -f
--path <base-path> - Use `<base-path>/.shep` instead of searching.
Commands:
| Command | | Example |
| ------- | ----------- | ------- |
| init | Create a `.shep` folder here. | `shep init` |
| up | Ensure the daemon is running. | `shep up` |
| down | Stop the daemon. | `shep down` |
| add | Add a process group. | `shep add echo --exec "node echo.js" --port 8081` |
| remove | Remove a process group. | `shep remove echo` |
| replace | Replace a group with new settings. | `shep replace echo --exec "node foo.js"` |
| start | Start processes (autostarts the daemon). | `shep start echo-1` |
| stop | Stop processes. | `shep stop echo` |
| restart | Restart processes. | `shep restart echo-1` |
| disable | Disable an instance or group. | `shep disable --group foo` |
| enable | Enable an instance or group. | `shep enable --instance foo-1` |
| status | Report the current status. | `shep status --verbose` |
| config | Manage the config file. | `shep config --list` |
| health | Manage a health-check on a group. | `shep health --group foo --status 200 --interval 3` |
| log | Manage the log output. | `shep log --tail` |
| nginx | Configure the nginx integration. | `shep nginx --file '%/nginx'` |
| scale | Scale a process group to a new size. | `shep scale echo --count 2` |
Files
-----
`shep` reads and writes state from a `.shep` directory. You can specify this directory using `SHEPHERD_PATH` in the environment, or using the `--path` argument to any command. If unspecified, `shep` will search for a `.shep` directory using the same rule Git uses to search for a `.git` folder: Start in the working directory, and check each parent until you find one. `shep init` is the only command that skips this search.
Files inside the `.shep` directory:
config - A list of commands to execute at daemon startup.
defaults - Will be copied to config by 'shep init'. This file should be in source control.
socket - A unix socket used by the daemon to listen for commands.
pid - Contains the pid of any currently running daemon.
log - The (default) location to log output from all managed processes.
nginx - The (default) location to keep an up-to-date set of nginx upstreams.
When reading the `config` file, any occurrence of "%" will be replaced with the full path to the `.shep` directory.
`> shep init`
-----------
`init` ensures that a `.shep` folder exists in the working directory.
If a `.shep` folder already exists, and has a `defaults` file, but no `config` file, it will copy `defaults` to `config`.
`> shep up`
---------
`up` ensures that a daemon has been spawned to manage the current `.shep` directory.
--verbose - Launch the daemon with verbose logging.
If `.shep/config` exists, each line will be read in as if it had been given as a command to `shep`, eg:
log --file "%/log"
add echo --cd test/echo --exec "node echo_server.js" --count 4 --port 9001
nginx --disable
start
When the daemon starts, it will create `.shep/socket` and `.shep/pid`, and possibly others.
Where indicated below, many commands cause the currently running configuration to be written to the `config` file (overwriting that file).
`> shep down`
---------
`down` stops the current daemon, and all processes it was managing.
`> shep add`
----------
`add` will add a group, it accepts a standard set of options for
specifying a group:
--group <name> - Required. Process ids will be like <group-name>-1, etc.
--cd <path> - The working directory for new processes. Optional. Default "."
--exec <command> - The shell command to launch the process. Required.
--count <n> - Optional. Default 1
--port <port> - The starting port. If n > 0 then port will be incremented. Optional.
--grace <ms> - How long to allow the process to startup. Optional. Default 9000
If `--port` is specified, each new process is given `PORT` in it's environment. The process is `"started"` once it is listening on it's given `PORT`. Failure to listen on `PORT` within the `--grace` timeout will cause that process to become `"failed"` and not restarted.
If `--port` is not specified, then the process is `"started"` if it stays up for it's full `--grace` period. Be careful if you use long `--grace` times, with no `--port`, and high `--count`; this combination will lead to a slow `start` for that group.
This command causes `config` to be re-written.
`> shep remove`
-------------
`remove` will (stop and) remove a current process group.
--group <name>
This command causes `config` to be re-written.
`> shep replace`
--------------
`replace` will first `remove` then re-`add` a group, using the new options. Uses the same options as `add`.
All the processes in the group will be stopped (during the remove), and started (after the add).
This command causes `config` to be re-written.
`> shep scale`
------------
`scale` will change just the `--count` option for a group, and will only effect current processes if the new `<n>` is smaller.
--group <name>
--count <n>
If the `--group` is started, then processes will be started or stopped immediately.
This command causes `config` to be re-written. The new config will not contain a `--scale` command directly, but instead this scaling will be reflected in the corresponding `add --group` command.
`> shep start`
------------
`start` can start specified groups, or processes.
--group <name>
--instance <instance-id>
If no options are given, everything will be started.
If the daemon is not running, `up` will be called automatically.
`> shep stop`
-----------
`stop` can stop specified group, or processes.
--group <name>
--instance <instance-id>
If no options are given, everything will be stopped.
`> shep restart`
------------
`restart` can start specified groups, or processes.
--group <name>
--instance <instance-id>
If no options are given, everything will be started.
Processes will be restarted serially within a group, but multiple groups will restart in parallel.
`> shep log`
`log` controls the combined output of all managed processes.
--file <path> - eg, the default is "%/log".
--disable - Don't write any log file to disk.
--tail - Stream the log output. Works even when log file is disabled.
When using `--tail`, it will keep the process open until you hit `Ctrl-C`, and behaves like `tail -f api.log`.
The difference is that it streams from inside the daemon, through the `socket` file, and to the `shep` client (no file needed).
`> shep nginx`
------------
`nginx` controls the built-in nginx integration.
--file <path> - Where to keep an up-to-date set of upstreams.
--keepalive <n> - How many connections should nginx keep-alive to each pool.
--reload <command> - How to notify nginx to reload an updated config.
--disable - Don't write any nginx configuration (default).
The generated upstreams file might look like this:
upstream group_name {
server 127.0.0.1:9001 weight=0 down; # disabled
server 127.0.0.1:9002 weight=1; # started
server 127.0.0.1:9003 weight=1 down; # enabled, but not started
keepalive 32;
}
This file is re-generated, and nginx is notified to (gently) check for configuration changes as process statuses change.