代码拉取完成,页面将自动刷新
package utils
import (
"os"
"sync"
"syscall"
"time"
log "github.com/sirupsen/logrus"
)
var handlers = make([]func(error), 0)
func writeFile(fpath, content string) error {
defer os.Remove(fpath) // It's necessary.
fh, err := os.Create(fpath)
if err != nil {
return err
}
if _, err = fh.WriteString(content); err != nil {
fh.Close()
return err
}
return fh.Close()
}
func checkIoError(fpath string) error {
err := writeFile(fpath, time.Now().Format(time.RFC3339))
if err == nil {
return nil
}
// Only treat ENOSPC and EROFS as error
patherr, ok := err.(*os.PathError)
if ok && (patherr.Err == syscall.ENOSPC || patherr.Err == syscall.EROFS) {
return err
} else {
log.Debugf("disk error: %v", err)
}
return nil
}
func diskmon(fpath string, onFailure func(error), interval time.Duration) {
log.Debugf("start disk monitor: %s", fpath)
for {
if err := checkIoError(fpath); err != nil {
log.Debugf("disk error: %v", err)
for _, f := range handlers {
f(err)
}
onFailure(err)
}
log.Debugf("disk no error")
time.Sleep(interval)
}
}
func RegisterDiskFullHandler(f func(error)) {
handlers = append(handlers, f)
}
var once sync.Once
func StartDiskMon(fpath string, onFailure func(error), interval time.Duration) {
once.Do(func() {
go diskmon(fpath, onFailure, interval)
})
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。