code: func execP2PNode() {
  	glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat()))
  	glogger.Verbosity(log.LvlInfo)
  	log.Root().SetHandler(glogger)
  	statusURL := os.Getenv(envStatusURL)
  	if statusURL == "" {
  		log.Crit("missing " + envStatusURL)
  	}
  
  	// Start the node and gather startup report.
  	var status nodeStartupJSON
  	stack, stackErr := startExecNodeStack()
  	if stackErr != nil {
  		status.Err = stackErr.Error()
  	} else {
  		status.WSEndpoint = "ws://" + stack.WSEndpoint()
  		status.NodeInfo = stack.Server().NodeInfo()
  	}
  
  	// Send status to the host.
  	statusJSON, _ := json.Marshal(status)
  	if _, err := http.Post(statusURL, "application/json", bytes.NewReader(statusJSON)); err != nil {
  		log.Crit("Can't post startup info", "url", statusURL, "err", err)
  	}
  	if stackErr != nil {
  		os.Exit(1)
  	}
  
  	// Stop the stack if we get a SIGTERM signal.
  	go func() {
  		sigc := make(chan os.Signal, 1)
  		signal.Notify(sigc, syscall.SIGTERM)
  		defer signal.Stop(sigc)
  		<-sigc
  		log.Info("Received SIGTERM, shutting down...")
  		stack.Stop()
  	}()
  	stack.Wait() // Wait for the stack to exit.
  }
docs: // execP2PNode starts a simulation node when the current binary is executed with
  // argv[0] being "p2p-node", reading the service / ID from argv[1] / argv[2]
  // and the node config from an environment variable.