执行Shell命令

package main

import (
	"fmt"

	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/os/gproc"
)

func main() {
	r, err := gproc.ShellExec(gctx.New(), `sleep 3; echo "hello gf!";`)
	fmt.Println("result:", r)
	fmt.Println(err)
}

执行后,可以看到程序等待了3秒之后,输出结果为:

result: hello gf!

<nil>

主进程与子进程

gproc.Manager对象创建的进程都默认带子进程标识,在子进程程序中可以通过gproc.IsChild()方法来判断自身是否为子进程。

package main

import (
	"os"
	"time"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/os/gproc"
)

func main() {
	var ctx = gctx.New()
	if gproc.IsChild() {
		g.Log().Printf(ctx, "%d: Hi, I am child, waiting 3 seconds to die", gproc.Pid())
		time.Sleep(time.Second)
		g.Log().Printf(ctx, "%d: 1", gproc.Pid())
		time.Sleep(time.Second)
		g.Log().Printf(ctx, "%d: 2", gproc.Pid())
		time.Sleep(time.Second)
		g.Log().Printf(ctx, "%d: 3", gproc.Pid())
	} else {
		m := gproc.NewManager()
		p := m.NewProcess(os.Args[0], os.Args, os.Environ())
		p.Start(ctx)
		p.Wait()
		g.Log().Printf(ctx, "%d: child died", gproc.Pid())
	}
}

执行后,终端打印结果如下:

2018-05-18 14:35:41.360 28285: Hi, I am child, waiting 3 seconds to die
2018-05-18 14:35:42.361 28285: 1
2018-05-18 14:35:43.361 28285: 2
2018-05-18 14:35:44.361 28285: 3
2018-05-18 14:35:44.362 28278: child died

多进程管理

gproc除了能够创建子进程,管理子进程之外,也能管理非自身创建的其他进程。gproc可以同时管理多个进程,这里以单个进程为例来演示对进程的管理功能。

  1. 我们使用gedit软件(Linux下常用的文本编辑器)随意打开一个文件,在进程当中我们看到该gedit的进程ID为28536

     $ ps aux | grep gedit
     john  28536  3.6  0.6 946208 56412 ?  Sl  14:39  0:00 gedit /home/john/Documents/text
  2. 我们的程序如下:

    package main
    
    import (
    	"fmt"
    
    	"github.com/gogf/gf/v2/os/gproc"
    )
    
    func main() {
    	pid := 28536
    	m := gproc.NewManager()
    	m.AddProcess(pid)
    	m.KillAll()
    	m.WaitAll()
    	fmt.Printf("%d was killed\n", pid)
    }

    执行后,gedit被关闭,终端输出信息为:

    28536 was killed






Content Menu

  • No labels

2 Comments

  1. 请问需要配合标准输入 stdin 进行输入的程序,使用 ShellExec 是否不合适了?有没有推荐的使用方式?

  2. 我的程序和示例一样,但没有输出命令的执行结果
    package
    main

    import (
    "fmt"
    "github.com/gogf/gf/os/gproc"
    )

    func main () {
    r, err := gproc.ShellExec(`sleep 3s; echo "hello gf!";`)
    fmt.Println("result:", r)
    fmt.Println(err)
    }

    输出如下:
    result: 
    <nil>

    没有输出命令的执行结果,请问这是什么问题,版本问题?