@Override
  public void launch() {
    // TODO if can't be root, and ports > 1024 are in the allowed port range,
    // prefer that; could do this on SshMachineLocation which implements PortSupplier,
    // invoked from PortAttrSensorAndConfigKey, which is invoked from
    // MachineLifecycleTasks.preStartCustom
    Networking.checkPortsValid(MutableMap.of("httpPort", getHttpPort()));

    // We wait for evidence of running because, using
    // brooklyn.ssh.config.tool.class=brooklyn.util.internal.ssh.cli.SshCliTool,
    // we saw the ssh session return before the tomcat process was fully running
    // so the process failed to start.
    newScript(MutableMap.of("usePidFile", false), LAUNCHING)
        .body
        .append(
            format("cd %s", getRunDir()),
            BashCommands.requireExecutable("./sbin/nginx"),
            sudoBashCIfPrivilegedPort(
                getHttpPort(),
                format(
                    "nohup ./sbin/nginx -p %s/ -c conf/server.conf > %s 2>&1 &",
                    getRunDir(), getLogFileLocation())),
            format(
                "for i in {1..10}\n"
                    + "do\n"
                    + "    test -f %1$s && ps -p `cat %1$s` && exit\n"
                    + "    sleep 1\n"
                    + "done\n"
                    + "echo \"No explicit error launching nginx but couldn't find process by pid; continuing but may subsequently fail\"\n"
                    + "cat %2$s | tee /dev/stderr",
                getPidFile(), getLogFileLocation()))
        .execute();
  }
 @BeforeMethod(alwaysRun = true)
 public void setUp() throws Exception {
   managementContext = new LocalManagementContext();
   host =
       managementContext
           .getLocationManager()
           .createLocation(
               LocationSpec.create(SshMachineLocation.class)
                   .configure("address", Networking.getLocalHost())
                   .configure(SshTool.PROP_TOOL_CLASS, RecordingSshjTool.class.getName()));
 }
 public Map<String, Object> customSshConfigKeys() throws UnknownHostException {
   return MutableMap.<String, Object>of(
       "address",
       Networking.getLocalHost(),
       SshTool.PROP_SESSION_TIMEOUT.getName(),
       20000,
       SshTool.PROP_CONNECT_TIMEOUT.getName(),
       50000,
       SshTool.PROP_SCRIPT_HEADER.getName(),
       "#!/bin/bash");
 }
 public CalculatedStatus() {
   HostAndPort endpoint = getConfig(ENDPOINT);
   connected = Networking.isReachable(endpoint);
 }