add signal handler for SIGINT, SIGTERM and SIGABRT

This commit is contained in:
gcarq 2017-10-27 15:52:14 +02:00
parent 0c33e917d5
commit 4139b0b0c7
3 changed files with 38 additions and 4 deletions

View File

@ -6,6 +6,7 @@ import time
import traceback import traceback
from datetime import datetime from datetime import datetime
from typing import Dict, Optional from typing import Dict, Optional
from signal import signal, SIGINT, SIGABRT, SIGTERM
from jsonschema import validate from jsonschema import validate
@ -223,6 +224,23 @@ def init(config: dict, db_url: Optional[str] = None) -> None:
else: else:
update_state(State.STOPPED) update_state(State.STOPPED)
# Register signal handlers
for sig in (SIGINT, SIGTERM, SIGABRT):
signal(sig, cleanup)
def cleanup(*args, **kwargs) -> None:
"""
Cleanup the application state und finish all pending tasks
:return: None
"""
telegram.send_msg('*Status:* `Stopping trader...`')
logger.info('Stopping trader and cleaning up modules...')
update_state(State.STOPPED)
persistence.cleanup()
telegram.cleanup()
exit(0)
def app(config: dict) -> None: def app(config: dict) -> None:
""" """
@ -251,10 +269,10 @@ def app(config: dict) -> None:
time.sleep(exchange.EXCHANGE.sleep_time) time.sleep(exchange.EXCHANGE.sleep_time)
old_state = new_state old_state = new_state
except RuntimeError: except RuntimeError:
telegram.send_msg('*Status:* Got RuntimeError: ```\n{}\n```'.format(traceback.format_exc())) telegram.send_msg(
'*Status:* Got RuntimeError:\n```\n{}\n```'.format(traceback.format_exc())
)
logger.exception('RuntimeError. Trader stopped!') logger.exception('RuntimeError. Trader stopped!')
finally:
telegram.send_msg('*Status:* `Trader has stopped`')
def main(): def main():

View File

@ -37,6 +37,14 @@ def init(config: dict, db_url: Optional[str] = None) -> None:
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
def cleanup() -> None:
"""
Flushes all pending operations to disk.
:return: None
"""
Trade.session.flush()
class Trade(Base): class Trade(Base):
__tablename__ = 'trades' __tablename__ = 'trades'

View File

@ -17,7 +17,7 @@ logging.getLogger('requests.packages.urllib3').setLevel(logging.INFO)
logging.getLogger('telegram').setLevel(logging.INFO) logging.getLogger('telegram').setLevel(logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
_updater = None _updater: Updater = None
_CONF = {} _CONF = {}
@ -61,6 +61,14 @@ def init(config: dict) -> None:
) )
def cleanup() -> None:
"""
Stops all running telegram threads.
:return: None
"""
_updater.stop()
def authorized_only(command_handler: Callable[[Bot, Update], None]) -> Callable[..., Any]: def authorized_only(command_handler: Callable[[Bot, Update], None]) -> Callable[..., Any]:
""" """
Decorator to check if the message comes from the correct chat_id Decorator to check if the message comes from the correct chat_id