diff --git a/IPython/frontend/html/notebook/notebookapp.py b/IPython/frontend/html/notebook/notebookapp.py index 7679034..4a24538 100644 --- a/IPython/frontend/html/notebook/notebookapp.py +++ b/IPython/frontend/html/notebook/notebookapp.py @@ -303,9 +303,6 @@ class NotebookApp(BaseIPythonApplication): self.kernel_argv.append("--KernelApp.parent_appname='%s'"%self.name) def init_configurables(self): - # Don't let Qt or ZMQ swallow KeyboardInterupts. - signal.signal(signal.SIGINT, signal.SIG_DFL) - # force Session default to be secure default_secure(self.config) # Create a KernelManager and start a kernel. @@ -322,11 +319,9 @@ class NotebookApp(BaseIPythonApplication): # self.log is a child of. The logging module dipatches log messages to a log # and all of its ancenstors until propagate is set to False. self.log.propagate = False - - @catch_config_error - def initialize(self, argv=None): - super(NotebookApp, self).initialize(argv) - self.init_configurables() + + def init_webapp(self): + """initialize tornado webapp and httpserver""" self.web_app = NotebookWebApplication( self, self.kernel_manager, self.notebook_manager, self.log, self.webapp_settings @@ -339,7 +334,7 @@ class NotebookApp(BaseIPythonApplication): ssl_options = None self.web_app.password = self.password self.http_server = httpserver.HTTPServer(self.web_app, ssl_options=ssl_options) - if ssl_options is None and not self.ip: + if ssl_options is None and not self.ip and not (self.read_only and not self.password): self.log.critical('WARNING: the notebook server is listening on all IP addresses ' 'but not using any encryption or authentication. This is highly ' 'insecure and not recommended.') @@ -357,6 +352,23 @@ class NotebookApp(BaseIPythonApplication): else: self.port = port break + + @catch_config_error + def initialize(self, argv=None): + super(NotebookApp, self).initialize(argv) + self.init_configurables() + self.init_webapp() + + def cleanup_kernels(self): + """shutdown all kernels + + The kernels will shutdown themselves when this process no longer exists, + but explicit shutdown allows the KernelManagers to cleanup the connection files. + """ + self.log.info('Shutting down kernels') + km = self.kernel_manager + while km.kernel_ids: + km.kill_kernel(km.kernel_ids[0]) def start(self): ip = self.ip if self.ip else '[all ip addresses on your system]' @@ -371,15 +383,20 @@ class NotebookApp(BaseIPythonApplication): b = lambda : webbrowser.open("%s://%s:%i" % (proto, ip, self.port), new=2) threading.Thread(target=b).start() - - ioloop.IOLoop.instance().start() + try: + ioloop.IOLoop.instance().start() + except KeyboardInterrupt: + info("Interrupted...") + finally: + self.cleanup_kernels() + #----------------------------------------------------------------------------- # Main entry point #----------------------------------------------------------------------------- def launch_new_instance(): - app = NotebookApp() + app = NotebookApp.instance() app.initialize() app.start()