網站首頁 編程語言 正文
傳統方案--crontab
- 缺點
- 配置任務時,需要SSh登錄腳本服務器進行操作
- 服務器宕機,任務將終止調度,需要人工遷移
- 排查問題低效,無法方便的查看任務狀態與錯誤輸出
分布式任務調度
- 優點
- 可視化Web后臺,方便進行任務管理
- 分布式架構、集群化調度,不存在單點故障
- 追蹤任務執行狀態,采集任務輸出,可視化log查看
go執行shell命令
1、執行程序:/usr/bin/python start.py
-
2、調用命令:?cat nginx.log | grep "2022"
- bash模式
- 交互模式:ls -l
- 非交互模式:/bin/bash -c "ls -l" ------ 我們使用這個
- bash模式
實際我們在golang代碼中調用Linux命令
1、普通調用
package main import ( "fmt" "os/exec" ) var ( output []byte err error ) func main() { // 要執行的命令 cmd := exec.Command("bash.exe", "-c", "echo 111") // CombinedOutput-->捕獲異常跟命令輸出的內容 if output, err = cmd.CombinedOutput(); err != nil { fmt.Println("error is :", err) return } // 打印輸出結果 fmt.Println(string(output)) }
2、結合協程調用,可控制中斷調用
package main import ( "context" "fmt" "os/exec" "time" ) // 接收子協程的數據,協程之間用chan通信 type result struct { output []byte err error } func main() { // 執行一個cmd,讓他在一個攜程里面執行2s, // 1s的時候 殺死cmd var ( ctx context.Context cancelFunc context.CancelFunc cmd *exec.Cmd resultChan chan *result res *result ) // 創建一個結果隊列 resultChan = make(chan *result, 1000) /* 1. WithCancel()函數接受一個 Context 并返回其子Context和取消函數cancel 2. 新創建協程中傳入子Context做參數,且需監控子Context的Done通道,若收到消息,則退出 3. 需要新協程結束時,在外面調用 cancel 函數,即會往子Context的Done通道發送消息 4. 注意:當 父Context的 Done() 關閉的時候,子 ctx 的 Done() 也會被關閉 */ ctx, cancelFunc = context.WithCancel(context.TODO()) // 起一個協程 go func() { var ( output []byte err error ) // 生成命令 cmd = exec.CommandContext(ctx, "bash", "-c", "sleep 3;echo hello;") // 執行命令cmd.CombinedOutput(),且捕獲輸出 output, err = cmd.CombinedOutput() // 用chan跟主攜程通信,把任務輸出結果傳給main協程 resultChan <- &result{ err: err, output: output, } }() // Sleep 1s time.Sleep(time.Second * 1) // 取消上下文,取消子進程,子進程就會被干掉 cancelFunc() // 從子協程中取出數據 res = <-resultChan // 打印子協程中取出數據 fmt.Println(res.err) fmt.Println(string(res.output)) }
原文鏈接:https://www.cnblogs.com/hsyw/p/16026565.html
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-06-03 golang并發鎖使用詳解_Golang
- 2023-04-18 react-router?重新加回跳轉攔截功能詳解_React
- 2023-01-15 GoLang內存泄漏原因排查詳解_Golang
- 2022-11-02 python函數和python匿名函數lambda詳解_python
- 2022-08-20 Python中range()與np.arange()的具體使用_python
- 2023-01-15 Android開發可添加頭尾的RecycleView的實現_Android
- 2022-05-17 C++?std::shared_mutex讀寫鎖的使用_C 語言
- 2022-09-26 Python調整matplotlib圖片大小的3種方法匯總_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支