При тестирование своего приложения у меня появляется ошибка такого вида
Горутина отработала за 3.213085ms
open /dev/null: too many open files
Горутина отработала за 3.258772ms
open /dev/null: too many open files
Горутина отработала за 3.196158ms
open ./flowscript.sh: too many open files
open ./flowscript.sh: too many open files
open /dev/null: too many open files
Горутина отработала за 3.570144ms
Нашёл информацию, что необходимо изменить лимит открытых файлов в ОС пробовал по разному.
sudo sh -c "ulimit -Hn 500000 ; exec su \"$USER\""
vi /etc/sysctl.conf
fs.file-max = 500000
# vi /etc/security/limits.conf
* soft nofile 60000
* hard nofile 60000
Но все равно выходит данная ошибка.
Вот сам код, который я вызываю
func exec_cmd(cmd string,nfFile string,wg *sync.WaitGroup,f func ()string,args ...string){
t0 := time.Now()
os.Mkdir("tmp",os.ModePerm)
file, err := os.Create(bash_script);utils.Checkerr(err)
defer file.Close()
file.WriteString(binbash + "\n")
file.WriteString(cmd)
err = os.Chmod(bash_script,0777);utils.Checkerr(err)
bashscript := exec.Command("bash",bash_script,nfFile,args[0],args[1],f());utils.Checkerr(err)
err = bashscript.Run();utils.Checkerr(err)
t1 := time.Now()
fmt.Printf("Горутина отработала за %v\n", t1.Sub(t0))
wg.Done()
}
func main(){
t0 := time.Now()
var path = flag.String("p", "","Path to directory (including month)")
var filter = flag.String("f", "","Access list filename. Defaults to flow.acl.")
var nf = flag.String("nf","","Select the active definition. Defaults to default")
//var staticFile = flag.String("w", "","Write statistics to file")
flag.Parse();
flag.Usage = Usage
if len(os.Args) == 1 {
Usage()
os.Exit(1)
}
name := TempFileName() // имена временных файлов
var wg sync.WaitGroup
NetflowFileNames := getAbsolutePathToFileNetflow(*path) // имена файлов за вчерашний день
wg.Add(len(NetflowFileNames)) // 288
for _, filename := range NetflowFileNames{
go exec_cmd(cmdCommand,filename,&wg,name,*filter,*nf)
}
wg.Wait()
os.RemoveAll(bash_script)
t1 := time.Now()
fmt.Printf("Время работы программы: %v\n", t1.Sub(t0))
}
и тут у меня возникает вопрос, что лучше использовать горутины с каналами или же тип sync.WaitGroup