From 39374345d5d77c52ee19fdc1eb26129d3c2eb2dd Mon Sep 17 00:00:00 2001 From: Berger Eugene Date: Fri, 16 Aug 2024 00:33:32 +0300 Subject: [PATCH] feat #169: Add --detach option --- src/cmd/project_runner.go | 33 +++++++++++++++++++++++++++++++++ src/cmd/root.go | 13 +++++++++---- src/cmd/up.go | 8 +++++--- src/config/Flags.go | 2 ++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/cmd/project_runner.go b/src/cmd/project_runner.go index 64c31f2..b2a0635 100644 --- a/src/cmd/project_runner.go +++ b/src/cmd/project_runner.go @@ -1,12 +1,14 @@ package cmd import ( + "fmt" "github.com/f1bonacc1/process-compose/src/app" "github.com/f1bonacc1/process-compose/src/config" "github.com/f1bonacc1/process-compose/src/loader" "github.com/f1bonacc1/process-compose/src/tui" "github.com/rs/zerolog/log" "os" + "os/exec" "os/signal" "syscall" ) @@ -136,3 +138,34 @@ func quiet() func() { os.Stderr = serr } } + +func runInDetachedMode() { + log.Info().Msg("Running in detached mode") + fmt.Println("Starting Process Compose in detached mode. Use 'process-compose attach' to connect to it or 'process-compose down' to stop it") + //remove detached flag + for i, arg := range os.Args { + if arg == "-D" || arg == "--detached" { + os.Args = append(os.Args[:i], os.Args[i+1:]...) + break + } + } + // Prepare to launch the background process + os.Args = append(os.Args, "-t=false") + cmd := exec.Command(os.Args[0], os.Args[1:]...) + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setsid: true, // Detach from terminal + } + + // Redirect standard file descriptors to /dev/null + cmd.Stdin = nil + cmd.Stdout, _ = os.OpenFile("/dev/null", os.O_RDWR, 0) + cmd.Stderr, _ = os.OpenFile("/dev/null", os.O_RDWR, 0) + + // Start the process in the background + if err := cmd.Start(); err != nil { + panic(err) + } + + // Exit the parent process + os.Exit(0) +} diff --git a/src/cmd/root.go b/src/cmd/root.go index 6a553e6..069c71d 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -38,15 +38,20 @@ var ( pcFlags.PcThemeChanged = cmd.Flags().Changed(flagTheme) pcFlags.SortColumnChanged = cmd.Flags().Changed(flagSort) }, - Run: run, + Run: func(cmd *cobra.Command, args []string) { + runProjectCmd([]string{}) + }, } ) -func run(cmd *cobra.Command, args []string) { +func runProjectCmd(args []string) { defer func() { _ = logFile.Close() }() - runner := getProjectRunner([]string{}, false, "", []string{}) + if *pcFlags.IsDetached { + runInDetachedMode() + } + runner := getProjectRunner(args, *pcFlags.NoDependencies, "", []string{}) err := waitForProjectAndServer(!*pcFlags.IsTuiEnabled, runner) handleErrorAndExit(err) } @@ -90,7 +95,7 @@ func init() { _ = rootCmd.Flags().MarkDeprecated("keep-tui", "use --keep-project instead") if runtime.GOOS != "windows" { - //rootCmd.Flags().BoolVarP(pcFlags.IsDetached, "detached", "D", *pcFlags.IsDetached, "run process-compose in detached mode") + rootCmd.Flags().BoolVarP(pcFlags.IsDetached, "detached", "D", *pcFlags.IsDetached, "run process-compose in detached mode") rootCmd.PersistentFlags().StringVarP(pcFlags.UnixSocketPath, "unix-socket", "u", config.GetUnixSocketPath(), "path to unix socket (env: "+config.EnvVarUnixSocketPath+")") rootCmd.PersistentFlags().BoolVarP(pcFlags.IsUnixSocket, "use-uds", "U", *pcFlags.IsUnixSocket, "use unix domain sockets instead of tcp") } diff --git a/src/cmd/up.go b/src/cmd/up.go index b183cad..496d6f7 100644 --- a/src/cmd/up.go +++ b/src/cmd/up.go @@ -3,6 +3,7 @@ package cmd import ( "github.com/f1bonacc1/process-compose/src/admitter" "github.com/spf13/cobra" + "runtime" ) // upCmd represents the up command @@ -13,9 +14,7 @@ var upCmd = &cobra.Command{ If one or more process names are passed as arguments, will start them and their dependencies only`, Run: func(cmd *cobra.Command, args []string) { - runner := getProjectRunner(args, *pcFlags.NoDependencies, "", []string{}) - err := waitForProjectAndServer(!*pcFlags.IsTuiEnabled, runner) - handleErrorAndExit(err) + runProjectCmd(args) }, } @@ -38,6 +37,9 @@ func init() { upCmd.Flags().AddFlag(commonFlags.Lookup(flagSort)) upCmd.Flags().AddFlag(commonFlags.Lookup(flagTheme)) + if runtime.GOOS != "windows" { + upCmd.Flags().AddFlag(rootCmd.Flags().Lookup("detached")) + } _ = upCmd.Flags().MarkDeprecated("keep-tui", "use --keep-project instead") } diff --git a/src/config/Flags.go b/src/config/Flags.go index 752c0f2..c6e5b73 100644 --- a/src/config/Flags.go +++ b/src/config/Flags.go @@ -70,6 +70,7 @@ type Flags struct { OutputFormat *string DisableDotEnv *bool IsTuiFullScreen *bool + IsDetached *bool } // NewFlags returns new configuration flags. @@ -99,6 +100,7 @@ func NewFlags() *Flags { OutputFormat: toPtr(""), DisableDotEnv: toPtr(getDisableDotEnvDefault()), IsTuiFullScreen: toPtr(getTuiFullScreenDefault()), + IsDetached: toPtr(false), } }