Golang笔记:使用exec包执行外部程序与Shell命令

目的

程序中执行外部程序是比较常用的功能,Golang执行外部程序可以使用标准库中的 os/exec https://pkg.go.dev/os/exec 。这个包默认是用来执行外部程序的,可以通过调用Shell程序来执行Shell命令。这篇文章将对相关使用做个记录,方便自己查阅。

使用演示

使用 func Command(name string, arg ...string) *Cmd 可以建立一个要执行的命令对象, name 是要执行的程序, arg 是参数。

使用 func (c *Cmd) CombinedOutput() ([]byte, error) 方法可以运行命令,并返回标准输出和标准错误:
在这里插入图片描述
在这里插入图片描述

CombinedOutput 方法会阻塞程序直到执行结束:
在这里插入图片描述

可以调用Shell程序来执行Shell命令:
在这里插入图片描述

使用 func (c *Cmd) Start() error 可以启动命令,并不等待程序返回,这时候使用 func (c *Cmd) Wait() error 方法来阻塞直到程序结束:
在这里插入图片描述

Start 方法通常还可以和下面几个方法结合使用:
func (c *Cmd) StderrPipe() (io.ReadCloser, error)
func (c *Cmd) StdinPipe() (io.WriteCloser, error)
func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
这几个方法分别返回标准错误、标准输入、标准输出相关联的管道。 Wait 方法等到命令结束后会关闭这些管道。

在这里插入图片描述

如果使用的是前面阻塞的方式的话,会等到命令结束后才会输出消息。

os/exec 包中还提供了很多方法来执行相关操作,大多都是 Start 方法之上一层层的封装(包括前面的 CombinedOutput 方法)。

另外可以使用 func CommandContext(ctx context.Context, name string, arg ...string) *Cmd 方法来执行程序,该方式下可以使用上下文 ctx 相关的 Cancel 函数来提前终止程序进程:
在这里插入图片描述

Cmd结构体

type Cmd struct {
	Path         string               // 程序路径,如果使用相对路径,则会使用相对于下面Dir的路径
	Args         []string             // 程序执行参数
	Env          []string             // 程序运行环境变量,如果未指定则使用当前程序的环境变量
	Dir          string               // 程序执行的工作目录,如果未指定则使用当前程序的目录
	Stdin        io.Reader            // 标准输入,如果未指定的话就选择系统空设备,该参数也可以指定一个文件
	Stdout       io.Writer            // 标准输出,如果未指定的话就选择系统空设备,该参数也可以指定一个文件
	Stderr       io.Writer            // 标准错误输出,如果未指定的话就选择系统空设备,该参数也可以指定一个文件
	ExtraFiles   []*os.File           // 程序要打开的其它文档
	SysProcAttr  *syscall.SysProcAttr // 可选的特定操作系统的属性
	Process      *os.Process          // 程序进程
	ProcessState *os.ProcessState     // 程序进程状态
	Err          error                // 
	Cancel       func() error         // 
	WaitDelay    time.Duration        // 
}

总结

Golang执行执行外部程序与Shell命令还是比较方便的,实际使用中更多的需要注意阻塞方法以及持续执行的外部程序的处理。

可以借助 github.com/creack/pty 来实现虚拟终端交互功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,关于 Redis 连接池在 Golang 中的使用,我可以给您提供一些相关的类库和示例代码。 首先,Golang 中比较常用的 Redis 客户端有以下几个: 1. go-redis/redis 2. go-redis/cache 3. redigo 这三个客户端都支持连接池的使用,下面分别介绍一下它们的连接池使用方法。 1. go-redis/redis go-redis/redis 是 Redis 的 Golang 客户端,它提供了一个叫做 "Options" 的结构体,可以用来设置 Redis 连接池的相关选项,例如最大连接数、闲置连接数等等。 示例代码: ```go import ( "github.com/go-redis/redis" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10。 2. go-redis/cache go-redis/cache 是 go-redis/redis 的一个扩展库,它提供了一个基于 Redis 的缓存实现。它同样支持 Redis 连接池的使用,可以通过设置 "Options" 结构体中的 "PoolSize" 字段来设置最大连接数。 示例代码: ```go import ( "github.com/go-redis/cache/v8" "github.com/go-redis/redis/v8" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) cache := cache.New(&cache.Options{ Redis: client, LocalCache: cache.NewTinyLFU(1000, time.Minute), TTL: time.Hour, }) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10,并且使用 go-redis/cache 库创建了一个基于 Redis 的缓存实现。 3. redigo redigo 是 Redis 的 Golang 客户端,它同样支持 Redis 连接池的使用,可以通过设置 "Pool" 结构体中的 "MaxIdle" 和 "MaxActive" 字段来设置最大空闲连接数和最大活跃连接数。 示例代码: ```go import ( "github.com/gomodule/redigo/redis" ) func main() { pool := &redis.Pool{ Dial: func() (redis.Conn, error) { return redis.Dial("tcp", "localhost:6379") }, MaxIdle: 10, MaxActive: 100, } conn := pool.Get() } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大空闲连接数为 10,最大活跃连接数为 100。 以上就是三个常用的 Golang Redis 客户端的连接池使用方法,您可以根据实际需求选择适合自己的客户端和连接池设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值