执行Shell命令

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/os/gctx"
  5. "github.com/gogf/gf/v2/os/gproc"
  6. )
  7. func main() {
  8. r, err := gproc.ShellExec(gctx.New(), `sleep 3; echo "hello gf!";`)
  9. fmt.Println("result:", r)
  10. fmt.Println(err)
  11. }

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

  1. result: hello gf!
  2. <nil>

主进程与子进程

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

  1. package main
  2. import (
  3. "os"
  4. "time"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. "github.com/gogf/gf/v2/os/gproc"
  8. )
  9. func main() {
  10. var ctx = gctx.New()
  11. if gproc.IsChild() {
  12. g.Log().Printf(ctx, "%d: Hi, I am child, waiting 3 seconds to die", gproc.Pid())
  13. time.Sleep(time.Second)
  14. g.Log().Printf(ctx, "%d: 1", gproc.Pid())
  15. time.Sleep(time.Second)
  16. g.Log().Printf(ctx, "%d: 2", gproc.Pid())
  17. time.Sleep(time.Second)
  18. g.Log().Printf(ctx, "%d: 3", gproc.Pid())
  19. } else {
  20. m := gproc.NewManager()
  21. p := m.NewProcess(os.Args[0], os.Args, os.Environ())
  22. p.Start(ctx)
  23. p.Wait()
  24. g.Log().Printf(ctx, "%d: child died", gproc.Pid())
  25. }
  26. }

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

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

多进程管理

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

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

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

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/gogf/gf/v2/os/gproc"
    5. )
    6. func main() {
    7. pid := 28536
    8. m := gproc.NewManager()
    9. m.AddProcess(pid)
    10. m.KillAll()
    11. m.WaitAll()
    12. fmt.Printf("%d was killed\n", pid)
    13. }

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

    1. 28536 was killed