DONE
- process: .destroy
- state_machine: fix listen fiber leak
- add uptime
- refactor rpc call2
- use mutex to ensure started/exited ordering
- remove unneeded processes first
- job: support env ..with %<process_num>02d
- config overrides
- reload(dir)....(sv rr) will reread config from current dir
- server: implement shutdown(parallel stop with channel synchro)
- make command strings with arguments work
- refactor state_machine to process_fsm
- application logs are not routed through sv
- add stop/start commands
- fail process.start on first spawn error and change process state to FATAL
- add linear backoff (when a RUNNING process exits...it will restarted 'startretries' times with linear backoff)
- port to crystal 0.25.0
PENDING
- write tests
- take abstract socket lock when running rr/start/stop commands
- implement forced-shutdown
figure out how nginx/apache does log writes with 32k buffer....with or without locks?
MAYBE
- implement fd/socket passing
- state_machine: refactor to use state transitions
- add logger
- show/log spawn errors
- autorestart: true(done), false(done), unexpected(not implemented)
UNLIKELY
- size based logrotate(needs shared fds for similar processes to account for log size)
DESIGN ISSUES
- race condition in STARTED/EXITED will cause infinite start retries (in a very unlikely case where startsecs ~= num secs for which process runs before exiting) due to the following state transitions STARTING -> EXITED -> STARTING -> RUNNING(event started) -> EXITED -> RUNNING
- Process.kill can kill the wrong process (race condition in kill/wait)