計時器Ticker和Timer
- 如果timer定時器要每隔間隔的時間執行,實現ticker的效果,使用 func (t *Timer) Reset(d Duration) bool
- timer可以reset
定時器Ticker:配合For循環爲長久死循環定時器,開協程同時和系統休眠爲定時循環用
package main
import (
"fmt"
"time"
)
func main() {
go func() {
myTicker := time.NewTicker(2 * time.Second)
for {
fmt.Println("Golang")
<-myTicker.C //阻塞,形成間隔
}
}()
time.Sleep(10 * time.Second)//設置定時10S
}
go func() {
tiker := time.NewTicker(time.Second)
for i := 0; i < 3; i++ {
if i == 2 {
break
} else {
fmt.Println(i)
}
<-tiker.C
}
}()
fmt.Println("end")
同步組做等待用
var wg sync.WaitGroup
for i := 0; i < 10; i++ {//設置次數
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("golang ....")
}()
time.Sleep(1 * time.Second)//設置時間間隔
}
wg.Wait()
定時器Timer
func goTicket() {
var myTimer *time.Timer
var wg sync.WaitGroup
for i := 0; i < 2; i++ {
index := i
wg.Add(1)
go func() {
defer wg.Done()
myTimer = time.NewTimer(2 * time.Second)
for {
select {
case <-myTimer.C:
myTimer.Reset(5 * time.Second)
fmt.Println("Reset...Reset.", time.Now().Format("2006-01-02 15:04:05"))
}
fmt.Println("end...", index)
}
}()
}
wg.Wait()
}
Flag的使用:
var name string
flag.StringVar(&name, "name", "everyone", "The greeting object.")
flag.Parse()
fmt.Println(name)
編譯:gobuild
windows環境:GoModTest.exe -name 123 123
不加參數輸出結果:everyone
os.Args的使用
func main() {
if SliceContainString(os.Args, "-v") {
fmt.Printf("%v\n", os.Args[2])
}
}
func SliceContainString(slice []string, sub string) bool {
for _, s := range slice {
if s == sub {
return true
}
}
return false
}
func Command(name string, arg …string) Cmd
方法返回一個Cmd, 用於執行name指定的程序(攜帶arg參數)
func (c *Cmd) Run() error
執行Cmd中包含的命令,阻塞直到命令執行完成
func (c *Cmd) Start() error
執行Cmd中包含的命令,該方法立即返回,並不等待命令執行完成
func (c *Cmd) Wait() error
該方法會阻塞直到Cmd中的命令執行完成,但該命令必須是被Start方法開始執行的
func (c *Cmd) Output() ([]byte, error)
執行Cmd中包含的命令,並返回標準輸出的切片
func (c *Cmd) CombinedOutput() ([]byte, error)
執行Cmd中包含的命令,並返回標準輸出與標準錯誤合併後的切片
func (c *Cmd) StdinPipe() (io.WriteCloser, error)
返回一個管道,該管道會在Cmd中的命令被啓動後連接到其標準輸入
func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
返回一個管道,該管道會在Cmd中的命令被啓動後連接到其標準輸出
func (c *Cmd) StderrPipe() (io.ReadCloser, error)
返回一個管道,該管道會在Cmd中的命令被啓動後連接到其標準錯誤
BasStoragePath = /tmp/bkdatabase/
BashNameOracleASM = hn_oracle_asm.sh
./rac.sh
執行腳本位於當前目錄中
func ExecShell(storagePath, fileName, command string) (string, error) {
logp.Info("lib ExecShell...")
//創建路徑
err := CreateBashDir(storagePath)
if err != nil {
return "", fmt.Errorf("CreateBashDir error: %v\n", err)
}
//寫入腳本
error := CreatBashAndWrite(storagePath+fileName, command)
if error != nil {
return "", fmt.Errorf("CreatBashAndWrite error: %v\n", error)
}
//執行命令
cmd := exec.Command("timeout", "60", storagePath+fileName)
stdout, err := cmd.CombinedOutput()
if err != nil {
return "", fmt.Errorf("Execute command error: %v\n", err)
}
return string(stdout), nil
}
重要:cmd := exec.Command(“timeout”, “5”, command)//重要,此處可以防止腳本超時執行,卡死