package main
/* Golang语言执行linux命令行 */
import (
"fmt"
"io/ioutil"
"os/exec"
"time"
)
func run() {
cmd := exec.Command("/bin/bash", "-c", "ping 127.0.0.1")
// 命令的输出直接扔掉
_, err := cmd.Output()
// 命令出错
if err != nil {
panic(err.Error())
}
// 命令启动和启动时出错
if err := cmd.Start(); err != nil {
panic(err.Error())
}
// 等待结束
if err := cmd.Wait(); err != nil {
panic(err.Error())
}
}
func main() {
// 异步线程
go run()
fmt.Println(time.Now().Format("2006.01.02 15:04:05"))
// 等待1秒
time.Sleep(1e9)
cmd := exec.Command("/bin/bash", "-c", `ps -ef | grep -v "grep" | grep "ping"`)
// 接收命令的标准输出
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Println("StdoutPipe: " + err.Error())
return
}
// 接受命令的标准错误
stderr, err := cmd.StderrPipe()
if err != nil {
fmt.Println("StderrPipe: ", err.Error())
return
}
// 启动
if err := cmd.Start(); err != nil {
fmt.Println("Start: ", err.Error())
return
}
// 读取错误信息
bytesErr, err := ioutil.ReadAll(stderr)
if err != nil {
fmt.Println("ReadAll stderr: ", err.Error())
return
}
if len(bytesErr) != 0 {
fmt.Printf("stderr is not nil: %s", bytesErr)
return
}
// 读取输出
bytes, err := ioutil.ReadAll(stdout)
if err != nil {
fmt.Println("ReadAll stdout: ", err.Error())
return
}
// 等等命令执行完成
if err := cmd.Wait(); err != nil {
fmt.Println("Wait: ", err.Error())
return
}
// 打印输出
fmt.Printf("stdout: %s", bytes)
// 等待主程序退出,携程退出.
time.Sleep(1e9 * 10)
}
// 运行命令: go run main.go
注明
cmd.Output() 会自带启动start并等程序执行完成把b,err返回,在此之前阻塞下面的指令。
cmd.Start() 启动而不阻塞。
cmd.Wart() 需要和Start配合,cmd返回前阻塞。
package main
import (
"fmt"
"os/exec"
)
func main() {
c := exec.Command("/bin/bash", "-c", "vmstat 1 5")
fmt.Printf("our==> %s", "000\n")
// _, err := c.Output()
// if err != nil {
// fmt.Println("err==> ", err)
// return
// }
fmt.Printf("our==> %s", "111\n")
c.Start()
fmt.Printf("our==> %s", "222\n")
c.Wait()
fmt.Printf("our==> %s", "333\n")
}
注明:
cmd.StdoutPipe() 使用也不能实时拿到cmd输出
cmd.StderrPipe() 使用也不能实时拿到cmd输出
package main
import (
"fmt"
"io/ioutil"
"os/exec"
)
func main() {
c := exec.Command("/bin/bash", "-c", "vmstat 1 5")
fmt.Printf("out==> %s", "000\n")
stdout, _ := c.StdoutPipe()
stderr, _ := c.StderrPipe()
c.Start()
b1, _ := ioutil.ReadAll(stdout) //只有这个有输出. 且是5秒后。
b2, _ := ioutil.ReadAll(stderr)
fmt.Printf("1out==> %s", b1)
fmt.Printf("2err==> %s", b2)
c.Wait()
b1, _ = ioutil.ReadAll(stdout)
b2, _ = ioutil.ReadAll(stderr)
fmt.Printf("3out==> %s", b1)
fmt.Printf("4err==> %s", b2)
}