Skip to main content

Supervisor plugin to watch a build version file and restart programs on update. Specifically built to support Laravel Queues.

Project description

Releasemon

Supervisor plugin to watch a build version file and restart programs on update

Overview

Releasemon is designed to actively monitor a known version file for changes, and if an update occurs restart supervisor managed programs.

It was specifically written to restart Laravel queues on deployment when the contents of a known version or timestamp file has changed.

Originally inspired by Tim Schumacher's superfsmon script, releasemon is optimized to restart applications only when a specific file is seen to have updates made to its contents. This is more resource friendly as it won't keep file notification handles open for every file in a given directory (e.g all your repository source files) which can cause inotify limits to be hit on large filesystems. Notably, simply updating the timestamp (e.g. through an rsync) will NOT force restart, meaning you can limit restarts based on explicit file updates and not through unreleated filesystem changes.

realeasmon also adds some new functionality such as random offsets on restart times (which can be useful for distributing load spikes).

Specifically, releasemon will:

  • Monitor a given version file on the filesystem
  • If a change is detected, it will re-read the version and see if it has been updated
  • If it has, it will restart the supervisor programs or groups as required

In addition, releasemon will:

  • Allow for pre-restart and post-restart scripts to be executed
  • Allow only 'RUNNING' processes to restart (to avoid multiple restarts on STARTING processes)
  • Limit the number of files being monitored to only one (limiting inotify resources needed)

Releasemon uses Supervisor's XML-RPC API. Your supervisord.conf file must have a valid [unix_http_server] or [inet_http_server] section and a [rpcinterface:supervisor] section. If you are able to control your Supervisor instance with supervisorctl, you have already have this coonigured.

To restart your Laravel worker when the contents of /appdir/.version is updated, your supervisord.conf might look like this.

[program:laravel-worker]
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --max-time=3600

[program:releasemon]
command=releasemon /appdir/.version laravel-worker

You can use multiple instances of Releasemon to control different programs.

Installation

Python 2 and 3

pip install releasemon

Command Line Arguments

usage: releasemon [-h] [-e FLAG] [--disable [FLAG]]
                  [-rd SECONDS] [-fd SECONDS] [--running-only] 
                   [-g GROUP] [-a]
                  PATH [PROG [PROG ...]]

Supervisor plugin to watch a directory and restart programs on changes

optional arguments:
  -h, --help            show this help message and exit
  -e FLAG, --enable FLAG
                        disable functionality if flag is not set
  --disable [FLAG]      disable functionality if flag is set
  -rd, --random-delay   random delay in seconds prior to restarting after version change
  -fd, --fixed-delay    fixed delay in seconds prior to restarting after version change

additional tasks:
  -pre, --pre-restart   system command to run prior to restarting programs
  -post, --post-restart system command to run after restarting programs
  
directory monitoring:
  FILEPATH              full path to version file to watch for changes
        
programs:
  PROG                  supervisor program name to restart
  -g GROUP, --group GROUP
                        supervisor group name to restart
  -a, --any             restart any child of this supervisor

Examples

The following examples assume you make updates to the file /appdir/.version on each release:

Restart Supervisor program 'app':

[program:releasemon]
command=releasemon /appdir/.version app

Restart Supervisor program 'app' then run a post-update script:

[program:releasemon]
command=releasemon --pre-restart "echo 'POST ROTATE SCRIPT'" /appdir/.version app

Restart all Supervisor programs in the workers group after 10 seconds:

[program:releasemon]
command=releasemon --fixed-delay 10 -g workers /appdir/.version

Restart all Supervisor programs in the workers group after a random delay between 0 and 60 seconds:

[program:releasemon]
command=releasemon --random-delay 60 -g workers /appdir/.version

Restart all Supervisor programs

[program:releasemon]
command=releasemon -a /appdir/.version app

Disable functionality using an environment variable:

[program:releasemon]
command=releasemon /appdir/.version app1 -e %(ENV_CELERY_AUTORELOAD)s

Known Issues

Inspired by

Superfsmon by Tim Schumacher https://github.com/timakro/superfsmon

License

Copyright (C) 2019 James Cundle

License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html.

This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent per‐mitted by law.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

releasemon-1.0.1.tar.gz (6.5 kB view details)

Uploaded Source

File details

Details for the file releasemon-1.0.1.tar.gz.

File metadata

  • Download URL: releasemon-1.0.1.tar.gz
  • Upload date:
  • Size: 6.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.0 requests/2.18.4 setuptools/41.4.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/2.7.17

File hashes

Hashes for releasemon-1.0.1.tar.gz
Algorithm Hash digest
SHA256 733ded14dc8c2f317b419dda6d7d212ca844677c100ee277381d903ce778a43e
MD5 59602237037ef91986724defb997b462
BLAKE2b-256 fbc31e75d1a67a6e5c7d66fab4a03a410ad9eb782f00c500e13ee03876b74e87

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page