TSINGSEE青犀視訊編譯中通過Golang程式碼修改Linux服務的ulimit的實現
阿新 • • 發佈:2021-12-15
在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/
來源:稀土掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。