Parcourir la source

beam/examples/beamsh: support for background commands with '&' terminator

Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)
Solomon Hykes il y a 11 ans
Parent
commit
6e0a156d90
2 fichiers modifiés avec 16 ajouts et 3 suppressions
  1. 12 2
      pkg/beam/examples/beamsh/beamsh.go
  2. 4 1
      pkg/dockerscript/dockerscript.go

+ 12 - 2
pkg/beam/examples/beamsh/beamsh.go

@@ -136,9 +136,19 @@ func scriptString(script []*dockerscript.Command) string {
 func executeScript(client *net.UnixConn, script []*dockerscript.Command) error {
 	Debugf("executeScript(%s)\n", scriptString(script))
 	defer Debugf("executeScript(%s) DONE\n", scriptString(script))
+	var background sync.WaitGroup
+	defer background.Wait()
 	for _, cmd := range script {
-		if err := executeCommand(client, cmd); err != nil {
-			return err
+		if cmd.Background {
+			background.Add(1)
+			go func(client *net.UnixConn, cmd *dockerscript.Command) {
+				executeCommand(client, cmd)
+				background.Done()
+			}(client, cmd)
+		} else {
+			if err := executeCommand(client, cmd); err != nil {
+				return err
+			}
 		}
 	}
 	return nil

+ 4 - 1
pkg/dockerscript/dockerscript.go

@@ -10,6 +10,7 @@ import (
 type Command struct {
 	Args []string
 	Children []*Command
+	Background bool
 }
 
 type Scanner struct {
@@ -72,7 +73,7 @@ func parseArgs(s *Scanner) ([]string, rune, error) {
 			return args, tok, nil
 		}
 		if !s.commentLine {
-			if text == "{" || text == "}" || text == "\n" || text == "\r" || text == ";" {
+			if text == "{" || text == "}" || text == "\n" || text == "\r" || text == ";" || text == "&" {
 				return args, tok, nil
 			}
 			args = append(args, text)
@@ -106,6 +107,8 @@ func parse(s *Scanner, opener string) (expr []*Command, err error) {
 			cmd.Children = children
 		} else if afterArgs == "}" && opener != "{" {
 			return nil, fmt.Errorf("unexpected end of block '}'")
+		} else if afterArgs == "&" {
+			cmd.Background = true
 		}
 		if len(cmd.Args) > 0 || len(cmd.Children) > 0 {
 			expr = append(expr, cmd)