/** * High-level abstraction for running processes * (called from cli.Route()) */ func Run() { if _, err := os.Stat(Procfile); os.IsNotExist(err) { fmt.Println(red, "error:", reset, Procfile, "doesn't exist") os.Exit(1) } helpers.ApplicationRebuild() // sync // starting up tcp server, needed for hotswap go LaunchTcpServer() list := ProcessList{processes: listProcesses()} list.spawnAll() }
func (t *Server) RelaunchProcess(args *Args, reply *int) error { if RelaunchProcessFlag { RelaunchProcessFlag = false appProc := LaunchedProcesses[applicationProcessCode] // backupig application's process info processBackup := BackupProcess(appProc) // killing old app's process err := appProc.Process.Kill() if err != nil { log.Fatal("cli.RelaunchProcess()#54:", err) /////////// debug } appProc.Process.Kill() // rebuilding application helpers.ApplicationRebuild() // sync // Relaunch application newApplicationProc := exec.Command(processBackup.Path, processBackup.Args...) // streaming output from new app instance stdOut, _ := newApplicationProc.StdoutPipe() stdErr, _ := newApplicationProc.StderrPipe() go StreamOutput(stdOut, stdErr, applicationProcessCode) go newApplicationProc.Start() // updating `LaunchedProcesses` LaunchedProcesses[applicationProcessCode] = newApplicationProc RelaunchProcessFlag = true } return nil }