1. 程式人生 > 其它 >TSINGSEE青犀視訊編譯中通過Golang程式碼修改Linux服務的ulimit的實現

TSINGSEE青犀視訊編譯中通過Golang程式碼修改Linux服務的ulimit的實現

在EasyDSS、EasyGBS、EasyCVR和EasyNVR等產品中,如果部署在Linux系統下,當接入裝置過多時,由於作業系統對於開啟檔案數有一定限制,會出現程式報錯的現象,出現 “open too many files”錯誤。這個錯誤我們之前也介紹過一些解決方法,但是鑑於很多使用者都有類似情況,我們還是決定對程式碼進行研修,消除此類報錯。

這裡我們需要手動修改作業系統的配置,然後重啟作業系統使操作設定正確。但是手動操作比較麻煩,因此直接使用程式碼實現該功能。程式碼如下:

// Package base Copyright 2021 TSINGSEE.
// http://www.tsingsee.com
// ulimit 服務限制
// Creat By Sam
// History (Name, Time, Desc)
// (Sam, 20211202, 建立檔案)
package main

import (
   "bufio"
   "bytes"
   "errors"
   "fmt"
   "io"
   "io/ioutil"
   "os/exec"
   "runtime"
   "strings"
)

var ErrOsNotSupport = errors.New("OS not support, only linux can use this function")

func main() {
   fmt.Println("修改 ulimit 配置", ModifyServiceUlimit(1000000))
   fmt.Println("設定 ulimit 有效", SystemdConfEffect())
}

// 修改服務的 ulimit
func ModifyServiceUlimit(ulimit int) error {
   if runtime.GOOS != "linux" {
      return ErrOsNotSupport
   }

   //confFile := "C:\\Users\\sam\\Desktop\\going\\system.conf"
   confFile := "/etc/systemd/system.conf"
   readBytes, err := ioutil.ReadFile(confFile)
   if err != nil {
      return err
   }

   oriContent := string(readBytes)
   strReader := strings.NewReader(oriContent)
   br := bufio.NewReader(strReader)
   newLine := fmt.Sprintf("DefaultLimitNOFILE=%d\n", ulimit)
   findNofile := false
   var buffer bytes.Buffer

   for {
      l, e := br.ReadBytes('\n')
      if e == io.EOF {
         break
      }
      line := string(l)
      if strings.Contains(line, "DefaultLimitNOFILE") {
         line = newLine
         findNofile = true
      }
      buffer.WriteString(line)
   }

   // 如果未找到,則寫入 newLine
   if !findNofile {
      buffer.WriteString(newLine)
   }

   //fmt.Println(buffer.String())
   ioutil.WriteFile(confFile, buffer.Bytes(), 666)

   return nil
}

// systemctl daemon-reexec
// 重啟 systemd 配置,使 conf 生效
func SystemdConfEffect() error {
   if runtime.GOOS != "linux" {
      return ErrOsNotSupport
   }
   cmd := exec.Command("systemctl", "daemon-reexec")
   return cmd.Run()
}
複製程式碼

執行以上程式碼,將對應的開啟檔案限制修改為1000000。重啟執行的服務,檢視對應服務的開啟檔案數為1000000即可,如下:


作者:TSINGSEE
連結:https://juejin.cn/post/7041494791175012382/
來源:稀土掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。