From bee33bb081341313d787ab5fe3353fbb637e0481 Mon Sep 17 00:00:00 2001 From: akayi07 Date: Tue, 5 Oct 2021 11:37:45 +0800 Subject: [PATCH] update supervisor --- README.md | 135 ++++++++++++++++--------------------- supervisord.conf | 170 ++++++++++++++++++++++++++++++++++++++++++----- webhook.conf | 10 --- 3 files changed, 213 insertions(+), 102 deletions(-) delete mode 100644 webhook.conf diff --git a/README.md b/README.md index f33faae..3272137 100644 --- a/README.md +++ b/README.md @@ -2,111 +2,94 @@ [Supervisor](https://github.com/Supervisor/supervisor) is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. We use supervisor to monitor process. -The server piece of supervisor is named **supervisord**. It is responsible for starting child programs at its own invocation, responding to commands from clients, restarting crashed or exited subprocesseses, logging its subprocess stdout and stderr output, and generating and handling “events” corresponding to points in subprocess lifetimes. +Note that Supervisor has been tested and is known to run on Linux (Ubuntu 18.04), Mac OS X (10.4/10.5/10.6), and Solaris (10 for Intel) and FreeBSD 6.1. It will likely work fine on most UNIX systems and will *not* run at all under any version of Windows. -Here we take Ubuntu for example, you can get more info [here](http://supervisord.org/). +Here is an introuduction to web user interface of supervisor. Go through the following: -## Install supervisord: +## Install supervisord -```bash -# install Supervisord -sudo apt-get install -y supervisor +The server piece of supervisor is named **supervisord**. It is responsible for starting child programs at its own invocation, responding to commands from clients, restarting crashed or exited subprocesseses, logging its subprocess stdout and stderr output, and generating and handling “events” corresponding to points in subprocess lifetimes. + +Supervisor can be installed with `pip install`: +```bash +pip install supervisor ``` -## Configuration +Depending on the permissions of your system’s Python, you might need to be the root user to install Supervisor successfully using `pip`. -Configuration files of supervisord is in `/etc/supervisor`. If we look at the configuration file `/etc/supervisord/supervisord.conf`, we'll see at the following at the bottom: +You can install it without `pip`,get more info [here](http://supervisord.org/installing.html). -``` -[include] -files = /etc/supervisor/conf.d/*.conf -``` -It means any files found in `/etc/supervisor/conf.d/` and ending in `.conf` will be included. +## Configuration File + +The server process supervisord uses a configuration file which is typically located in `/etc/supervisord.conf`. Keep this file secure via proper filesystem permissions because it may contain unencrypted usernames and passwords. -Create a configuration at `/etc/supervisor/conf.d/webhooks.conf`: +Run: ``` -[program:nodehook] -command=/usr/bin/node /srv/http.js -directory=/srv -autostart=true -autorestart=true -startretries=3 -stderr_logfile=/var/log/webhook/nodehook.err.log -stdout_logfile=/var/log/webhook/nodehook.out.log -user=www-data -environment=SECRET_PASSPHRASE='this is secret',SECRET_TWO='another secret' +echo_supervisord_conf > supervisord.conf ``` -You can copy `webhook.conf` in the direcrtory of `README.md` to "/etc/supervisor/conf.d/". +to place the configuration file in the current directory. You can place it in `/etc` as long as you have root access. -1. [program:nodehook] - Define the program to monitor. We'll call it "nodehook". -2. command - This is the command to run that kicks off the monitored process. We use "node" and run the "http.js" file. If you needed to pass any command line arguments or other data, you could do so here. -3. directory - Set a directory for Supervisord to "cd" into for before running the process, useful for cases where the process assumes a directory structure relative to the location of the executed script. -4. autostart - Setting this "true" means the process will start when Supervisord starts (essentially on system boot). -5. autorestart - If this is "true", the program will be restarted if it exits unexpectedly. -6. startretries - The number of retries to do before the process is considered "failed" -7. stderr_logfile - The file to write any errors output. -8. stdout_logfile - The file to write any regular output. -9. user - The user the process is run as. -10. environment - Environment variables to pass to the process. +You can simply use `supervisord.conf` in the same directory of the `README.md` which is preconfigured. -Supervisord won't create a directory for logs if they do not exist; We need to create them before running Supervisord: +Note that you sholud change `command` in `[program:monitor]` section in `supervisord.conf`. The command will be run when supervisord is started. -``` -sudo mkdir /var/log/webhook -``` +If you want to configure supervisor by yourselft, visit http://supervisord.org/configuration.html. -## Web Interface +## Run Web Server -Inside of `/etc/supervisord.conf`, add this to configure a web interface in which there are all process being monitored and we can restart, stop, clear logs and check output on process: +The command-line client piece of the supervisor is named **supervisorctl**. It provides a shell-like interface to the features provided by supervisord. From supervisorctl, a user can connect to different supervisord processes (one at a time), get status on the subprocesses controlled by, stop and start subprocesses of, and get lists of running processes of a supervisord. -``` -[inet_http_server] -port = 9001 -username = user # username -password = pass # password +A (sparse) web user interface with functionality comparable to supervisorctl may be accessed via a browser if you start supervisord against an internet socket. -``` -You can copy `supervisord.conf` in the directory of `README.md` to overwrite `/etc/supervisor/supervisord.conf`. +At first, you shoud find out the place in which your supervisord and supervisorctl was installed. The position depends on platforms you use. Say, run `whereis supervisord` to find out the place. You should find the place of supervisorctl in the same directory. Here we take `~/.local/bin/` according to the output of `whereis supervisord` in Ubuntu version 20.04 for example. -Access the server in a web browser at port 9001, we'll see a web interface. Click the process name ("nodehook" in this case) will show the logs for that process. +### Start **supervisord** -The interface asks you for a username and a password. In this case, enter "user" and "pass" to the input boxes. +run -## Run Locally +```` +~/.local/bin/supervisord -c supervisord.conf +```` -```bash -# start supervisor as a service -sudo service supervisor start -# Now that we've configured Supervisord to monitor process, we can read the configuration in and then reload Supervisord, using the "supervisorctl" tool: -supervisorctl reread -supervisorctl update -# running process; the command will enter into a console -supervisorctl -``` -In the console of supervisorctl: +The “-c” argument after the command above specifying an absolute path to a configuration file to ensure that someone doesn’t trick you into running supervisor from within a directory that contains a rogue `supervisord.conf` file. Here use the configuration file in the same directory of `README.md`. -Start nodehook process: +### Start **supervisorctl** -```bash -start nodehook -``` +run -Stop nodehook: +```` +~/.local/bin/supervisorctl +```` -```bash -stop nodehook -``` +A shell will be presented that will allow you to control the processes that are currently managed by supervisord. In the shell, you can run `supervisorctl stop all` to terminate the supervisord process. -Use or type "exit" to get out of the supervisorctl tool. +### Visit the Server URL -You can also use theses commands in terminal(**Not in supervisorctl console**): +Visit the server URL on which supervisord server is listening (default “http://localhost:9001”) to view and control process status through the web interface. -```bash -supervisorctl start nodebook -supervisorctl stop nodebook -``` -Enter `localhost:9001` in a browser to access the server. Enter the username and the password to the web interface. Switch to root account may help solving problems when you run the commands above. +You can change the server URL via `-s` argument. See [here](http://supervisord.org/running.html#supervisorctl-command-line-options). + +### An Brief Introduction To the Web Interface + +The web page of the browser would ask for username and password. You can find them in the `[inet_http_server]` section in `supervisord.conf`. + +In the web interface, there is a process named monitor in the table if you do not change the name of the program in `supervisord.conf`. + +There are three buttons on the table: + +1. REFRESH: refresh the page +2. RESTART ALL: restart all process +3. STOP ALL: terminate all process + +Here is the explanation of each column in the table: + +1. The 1st column is the state of the process + +2. The 2nd column is the time when the process start or restart + +3. The 3nd column is the name of the process, click the name to view the output of the process +4. The last column is the operation you can do. The first one is for starting the process. The second one is clear log of the process. The third one is the output of the process. The last one is the error of the process. diff --git a/supervisord.conf b/supervisord.conf index 6a1236c..137f4ae 100644 --- a/supervisord.conf +++ b/supervisord.conf @@ -1,22 +1,164 @@ -; supervisor config file +; Sample supervisor config file. +; +; For more information on the config file, please see: +; http://supervisord.org/configuration.html +; +; Notes: +; - Shell expansion ("~" or "$HOME") is not supported. Environment +; variables can be expanded using this syntax: "%(ENV_HOME)s". +; - Quotes around values are not supported, except in the case of +; the environment= options as shown below. +; - Comments must have a leading space: "a=b ;comment" not "a=b;comment". +; - Command will be truncated if it looks like a config file comment, e.g. +; "command=bash -c 'foo ; bar'" will truncate to "command=bash -c 'foo ". +; +; Warning: +; Paths throughout this example file use /tmp because it is available on most +; systems. You will likely need to change these to locations more appropriate +; for your system. Some systems periodically delete older files in /tmp. +; Notably, if the socket file defined in the [unix_http_server] section below +; is deleted, supervisorctl will be unable to connect to supervisord. [unix_http_server] -file=/var/run/supervisor.sock ; (the path to the socket file) -chmod=0700 ; sockef file mode (default 0700) +file=/tmp/supervisor.sock ; the path to the socket file +;chmod=0700 ; socket file mode (default 0700) +;chown=nobody:nogroup ; socket file uid:gid owner +;username=user ; default is no username (open server) +;password=123 ; default is no password (open server) + +; Security Warning: +; The inet HTTP server is not enabled by default. The inet HTTP server is +; enabled by uncommenting the [inet_http_server] section below. The inet +; HTTP server is intended for use within a trusted environment only. It +; should only be bound to localhost or only accessible from within an +; isolated, trusted network. The inet HTTP server does not support any +; form of encryption. The inet HTTP server does not use authentication +; by default (see the username= and password= options to add authentication). +; Never expose the inet HTTP server to the public internet. + +[inet_http_server] ; inet (TCP) server disabled by default +port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface +username=user ; default is no username (open server) +password=123 ; default is no password (open server) [supervisord] -logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) -pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) -childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) +logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log +logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB +logfile_backups=10 ; # of main logfile backups; 0 means none, default 10 +loglevel=info ; log level; default info; others: debug,warn,trace +pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid +nodaemon=false ; start in foreground if true; default false +silent=false ; no logs to stdout if true; default false +minfds=1024 ; min. avail startup file descriptors; default 1024 +minprocs=200 ; min. avail process descriptors;default 200 +;umask=022 ; process file creation umask; default 022 +;user=supervisord ; setuid to this UNIX account at startup; recommended if root +;identifier=supervisor ; supervisord identifier, default is 'supervisor' +;directory=/tmp ; default is not to cd during start +;nocleanup=true ; don't clean up tempfiles at start; default false +;childlogdir=/tmp ; 'AUTO' child log dir, default $TEMP +;environment=KEY="value" ; key value pairs to add to environment +;strip_ansi=false ; strip ansi escape codes in logs; def. false + +; The rpcinterface:supervisor section must remain in the config file for +; RPC (supervisorctl/web interface) to work. Additional interfaces may be +; added by defining them in separate [rpcinterface:x] sections. -; the below section must remain in the config file for RPC -; (supervisorctl/web interface) to work, additional interfaces may be -; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface +; The supervisorctl section configures how supervisorctl will connect to +; supervisord. configure it match the settings in either the unix_http_server +; or inet_http_server section. + [supervisorctl] -serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket +serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket +;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket +;username=chris ; should be same as in [*_http_server] if set +;password=123 ; should be same as in [*_http_server] if set +;prompt=mysupervisor ; cmd line prompt (default "supervisor") +;history_file=~/.sc_history ; use readline history if available + +; The sample program section below shows all possible program subsection values. +; Create one or more 'real' program: sections to be able to control them under +; supervisor. + +[program:monitor] +command=/bin/bash ./monitor.sh ; the program (relative uses PATH, can take args) +;process_name=%(program_name)s ; process_name expr (default %(program_name)s) +;numprocs=1 ; number of processes copies to start (def 1) +;directory=/tmp ; directory to cwd to before exec (def no cwd) +;umask=022 ; umask for process (default None) +;priority=999 ; the relative start priority (default 999) +;autostart=true ; start at supervisord start (default: true) +;startsecs=1 ; # of secs prog must stay up to be running (def. 1) +;startretries=3 ; max # of serial start failures when starting (default 3) +autorestart=true ; when to restart if exited after running (def: unexpected) +;exitcodes=0 ; 'expected' exit codes used with autorestart (default 0) +;stopsignal=QUIT ; signal used to kill process (default TERM) +;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) +;stopasgroup=false ; send stop signal to the UNIX process group (default false) +;killasgroup=false ; SIGKILL the UNIX process group (def false) +;user=chrism ; setuid to this UNIX account to run the program +;redirect_stderr=true ; redirect proc stderr to stdout (default false) +;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO +;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) +;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) +;stdout_events_enabled=false ; emit events on stdout writes (default false) +;stdout_syslog=false ; send stdout to syslog with process name (default false) +;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO +;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) +;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) +;stderr_events_enabled=false ; emit events on stderr writes (default false) +;stderr_syslog=false ; send stderr to syslog with process name (default false) +;environment=A="1",B="2" ; process environment additions (def no adds) +;serverurl=AUTO ; override serverurl computation (childutils) + +; The sample eventlistener section below shows all possible eventlistener +; subsection values. Create one or more 'real' eventlistener: sections to be +; able to handle event notifications sent by supervisord. + +;[eventlistener:theeventlistenername] +;command=/bin/eventlistener ; the program (relative uses PATH, can take args) +;process_name=%(program_name)s ; process_name expr (default %(program_name)s) +;numprocs=1 ; number of processes copies to start (def 1) +;events=EVENT ; event notif. types to subscribe to (req'd) +;buffer_size=10 ; event buffer queue size (default 10) +;directory=/tmp ; directory to cwd to before exec (def no cwd) +;umask=022 ; umask for process (default None) +;priority=-1 ; the relative start priority (default -1) +;autostart=true ; start at supervisord start (default: true) +;startsecs=1 ; # of secs prog must stay up to be running (def. 1) +;startretries=3 ; max # of serial start failures when starting (default 3) +;autorestart=unexpected ; autorestart if exited after running (def: unexpected) +;exitcodes=0 ; 'expected' exit codes used with autorestart (default 0) +;stopsignal=QUIT ; signal used to kill process (default TERM) +;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) +;stopasgroup=false ; send stop signal to the UNIX process group (default false) +;killasgroup=false ; SIGKILL the UNIX process group (def false) +;user=chrism ; setuid to this UNIX account to run the program +;redirect_stderr=false ; redirect_stderr=true is not allowed for eventlisteners +;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO +;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) +;stdout_events_enabled=false ; emit events on stdout writes (default false) +;stdout_syslog=false ; send stdout to syslog with process name (default false) +;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO +;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) +;stderr_events_enabled=false ; emit events on stderr writes (default false) +;stderr_syslog=false ; send stderr to syslog with process name (default false) +;environment=A="1",B="2" ; process environment additions +;serverurl=AUTO ; override serverurl computation (childutils) + +; The sample group section below shows all possible group values. Create one +; or more 'real' group: sections to create "heterogeneous" process groups. + +;[group:thegroupname] +;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions +;priority=999 ; the relative start priority (default 999) ; The [include] section can just contain the "files" setting. This ; setting can list multiple files (separated by whitespace or @@ -24,9 +166,5 @@ serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ; interpreted as relative to this file. Included files *cannot* ; include files themselves. -[include] -files = /etc/supervisor/conf.d/*.conf -[inet_http_server] -port = 9001 -username = user # Basic auth username -password = pass # Basic auth password +;[include] +;files = relative/directory/*.ini diff --git a/webhook.conf b/webhook.conf deleted file mode 100644 index ef53b2b..0000000 --- a/webhook.conf +++ /dev/null @@ -1,10 +0,0 @@ -[program:nodehook] -command=/bin/bash ./monitor.sh -directory=/home/akayi/workspace/axies/src/monitor/ -autostart=true -autorestart=true -startretries=3 -stderr_logfile=/var/log/webhook/nodehook.err.log -stdout_logfile=/var/log/webhook/nodehook.out.log -user=www-data -environment=SECRET_PASSPHRASE='this is secret',SECRET_TWO='another secret'