go中使用cmd與crontab

2021-10-23 04:16:30 字數 2311 閱讀 9349

/bin/bash -c 「ls -l」

cmd->golang->pipe

pipe()建立2個檔案描述符,fd[0]可讀,fd[1]可寫

fork() 建立子程序 fd[1]被繼承到子程序

dup2() 重定向子程序 stdout/stderr到fd[1]

exec() 在當前程序內,載入並執行二進位制程式

模擬一下cmd呼叫

package main

import (

"fmt"

"os/exec"

)func main()

fmt.println(string(output))

}

模擬呼叫cmd時,殺死bash程序

package main

import (

"context"

"fmt"

"os/exec"

"time"

)type result struct

func main()

// 監聽到 select中有<-ctx.done 就殺掉當前的命令 pid , kill bash

cmd = exec.commandcontext(ctx,"/bin/bash","-c","sleep 2;echo hello;")

//執行任務,捕獲輸出

output,err = cmd.combinedoutput()

//任務輸出結果 傳給main協程

resultchan <- &result

}()time.sleep(time.second*1) //這裡1秒後就要將content關閉,所以bash程序會被殺死

cancelfunc()

res = <-resultchan

fmt.println(res.err,string(res.output))

}

分時日

月周shell命令

*/5***

*echo hello >/tmp/x.log

1-5***

*echo /usr/bin/python /data/x.py

010,22**

*echo hello

go開源cronexpr庫

parse() 解析與校驗cron表示式

next() 根據當前時間,計算下一次排程時間

模擬一下cron呼叫

//下次排程時間

nexttime = expr.next(now)

//多長時間後執行

time.afterfunc(nexttime.sub(now), func() )

time.sleep(time.second*5)

}執行結果

被排程了: 2020-02-05 17:19:25 +0800 cst
模擬多個cron呼叫

//任務註冊到任務表中

scheduletable["job1"] = cronjob

expr = cronexpr.mustparse("*/5 * * * * * *")

cronjob = &cronjob

//任務註冊到任務表中

scheduletable["job2"] = cronjob

// 需要有1個排程協程,它定時檢查所有的cron任務,誰過期就執行誰

go func() (jobname)

//計算下一次執行時間

cronjob.nexttime = cronjob.expr.next(now)}}

//這裡模擬一下休眠

select

} }()

time.sleep(time.second*100)

}執行結果

執行: job1

執行: job2

執行: job1

如何在Linux中使用at和crontab命令

經驗豐富的系統運維工程師可以使得linux在無需人為介入的情況下,在指定的時間段自動啟用或停止某些服務或命令,從而實現運維的自動化。儘管我們現在已經有了功能彪悍的指令碼程式來執行一些批處理工作,但是,如果仍然需要在每天凌晨兩點敲擊鍵盤回車鍵來執行這個指令碼程式,這簡直太痛苦了 當然,也可以訓練您的小...

在go中使用leveldb levi

當前版本的leveldb沒有帶安裝指令碼,需自行編譯安裝,過程如下 不知道為什麼,如果把leveldb的相關檔案放在 usr local對應的檔案下,安裝levigo怎麼也通不過,求路過大俠指點迷津。執行,會跑出如下錯誤 env posix.cc text 0x1e undefined refere...

Go語言中使用JSON

encode 將乙個物件編碼成json資料,接受乙個inte ce 物件,返回byte和error func marshal v inte ce byte,error marshal函式將會遞迴遍歷整個物件,依次按成員型別對這個物件進行編碼,型別轉換規則如下 bool型別 轉換為json的boole...