func CheckPID()

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)
}