github.com/schumacherfm/hugo@v0.47.1/commands/limit_darwin.go (about)

     1  // Copyright 2018 The Hugo Authors. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package commands
    15  
    16  import (
    17  	"syscall"
    18  
    19  	"github.com/spf13/cobra"
    20  	jww "github.com/spf13/jwalterweatherman"
    21  )
    22  
    23  var _ cmder = (*limitCmd)(nil)
    24  
    25  type limitCmd struct {
    26  	*baseCmd
    27  }
    28  
    29  func newLimitCmd() *limitCmd {
    30  	ccmd := &cobra.Command{
    31  		Use:   "ulimit",
    32  		Short: "Check system ulimit settings",
    33  		Long: `Hugo will inspect the current ulimit settings on the system.
    34  This is primarily to ensure that Hugo can watch enough files on some OSs`,
    35  		RunE: func(cmd *cobra.Command, args []string) error {
    36  			var rLimit syscall.Rlimit
    37  			err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    38  			if err != nil {
    39  				return newSystemError("Error Getting Rlimit ", err)
    40  			}
    41  
    42  			jww.FEEDBACK.Println("Current rLimit:", rLimit)
    43  
    44  			jww.FEEDBACK.Println("Attempting to increase limit")
    45  			rLimit.Max = 999999
    46  			rLimit.Cur = 999999
    47  			err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    48  			if err != nil {
    49  				return newSystemError("Error Setting rLimit ", err)
    50  			}
    51  			err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    52  			if err != nil {
    53  				return newSystemError("Error Getting rLimit ", err)
    54  			}
    55  			jww.FEEDBACK.Println("rLimit after change:", rLimit)
    56  
    57  			return nil
    58  		},
    59  	}
    60  
    61  	return &limitCmd{baseCmd: newBaseCmd(ccmd)}
    62  }
    63  
    64  func tweakLimit() {
    65  	var rLimit syscall.Rlimit
    66  	err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    67  	if err != nil {
    68  		jww.ERROR.Println("Unable to obtain rLimit", err)
    69  	}
    70  	if rLimit.Cur < rLimit.Max {
    71  		rLimit.Max = 64000
    72  		rLimit.Cur = 64000
    73  		err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    74  		if err != nil {
    75  			jww.WARN.Println("Unable to increase number of open files limit", err)
    76  		}
    77  	}
    78  }