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
可以同时管理多个进程,这里以单个进程为例来演示对进程的管理功能。
我们使用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
我们的程序如下:
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 |