in internal/util/util.go [118:146]
func CheckPID(fname string, logger *log.Logger) error {
if _, err := os.Stat(fname); os.IsNotExist(err) {
return savePID(fname, os.Getpid(), logger)
}
content, err := ioutil.ReadFile(fname)
if err != nil {
logger.Error("unable to read PID file", zap.String("file", fname), zap.Error(err))
return err
}
readPID, err := strconv.Atoi(string(content))
if err != nil {
logger.Error("invalid content inside PID file", zap.String("file", fname), zap.Error(err))
return savePID(fname, os.Getpid(), logger)
}
// Sending the signal 0 to a given PID just checks if any process with the given PID is running
// and you have the permission to send a signal to it.
if err = syscall.Kill(readPID, 0); err == nil {
logger.Error("Arachne already running and different from self PID",
zap.Int("other_PID", readPID),
zap.Int("self_PID", os.Getpid()))
return errors.New("Arachne already running and different from self PID")
}
return savePID(fname, os.Getpid(), logger)
}