diff --git a/tensorboard/BUILD b/tensorboard/BUILD index 6dd10fd00f..e775fc4717 100644 --- a/tensorboard/BUILD +++ b/tensorboard/BUILD @@ -102,11 +102,13 @@ py_library( srcs_version = "PY2AND3", visibility = ["//visibility:public"], deps = [ + ":manager", ":version", "//tensorboard/backend:application", "//tensorboard/backend/event_processing:event_file_inspector", "//tensorboard/util", "@org_pocoo_werkzeug", + "@org_pythonhosted_six", ], ) diff --git a/tensorboard/program.py b/tensorboard/program.py index 1a528d8f3a..316ef0cdfb 100644 --- a/tensorboard/program.py +++ b/tensorboard/program.py @@ -32,7 +32,9 @@ from abc import ABCMeta from abc import abstractmethod import argparse +import atexit from collections import defaultdict +import datetime import errno import os import signal @@ -41,8 +43,11 @@ import threading import inspect +import six +from six.moves import urllib from werkzeug import serving +from tensorboard import manager from tensorboard import version from tensorboard.backend import application from tensorboard.backend.event_processing import event_file_inspector as efi @@ -100,6 +105,7 @@ class TensorBoard(object): assets_zip_provider: Set by constructor. server_class: Set by constructor. flags: An argparse.Namespace set by the configure() method. + cache_key: As `manager.cache_key`; set by the configure() method. """ def __init__(self, @@ -167,6 +173,11 @@ def configure(self, argv=('',), **kwargs): loader.define_flags(parser) arg0 = argv[0] if argv else '' flags = parser.parse_args(argv[1:]) # Strip binary name from argv. + self.cache_key = manager.cache_key( + working_directory=os.getcwd(), + arguments=argv[1:], + configure_kwargs=kwargs, + ) if absl_flags and arg0: # Only expose main module Abseil flags as TensorBoard native flags. # This is the same logic Abseil's ArgumentParser uses for determining @@ -212,6 +223,7 @@ def main(self, ignored_argv=('',)): sys.stderr.write('TensorBoard %s at %s (Press CTRL+C to quit)\n' % (version.VERSION, server.get_url())) sys.stderr.flush() + self._register_info(server) server.serve_forever() return 0 except TensorBoardServerException as e: @@ -239,6 +251,26 @@ def launch(self): thread.start() return server.get_url() + def _register_info(self, server): + """Write a TensorboardInfo file and arrange for its cleanup. + + Args: + server: The result of `self._make_server()`. + """ + server_url = urllib.parse.urlparse(server.get_url()) + info = manager.TensorboardInfo( + version=version.VERSION, + start_time=datetime.datetime.now(), + port=server_url.port, + pid=os.getpid(), + path_prefix=self.flags.path_prefix, + logdir=self.flags.logdir, + db=self.flags.db, + cache_key=self.cache_key, + ) + atexit.register(manager.remove_info_file) + manager.write_info_file(info) + def _install_signal_handler(self, signal_number, signal_name): """Set a signal handler to gracefully exit on the given signal.