日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

golang代碼中調用Linux命令_Golang

作者:taotaozh ? 更新時間: 2023-05-21 編程語言

傳統方案--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" ------ 我們使用這個

實際我們在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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新