functions

The Fool guy's FAAS
git clone git://git.lair.cx/functions
Log | Files | Refs | README

pid.go (780B)


      1 package pid
      2 
      3 import (
      4 	"errors"
      5 	"os"
      6 	"strconv"
      7 	"syscall"
      8 )
      9 
     10 func Read(filename string) (pid int, err error) {
     11 	data, err := os.ReadFile(filename)
     12 	if err != nil {
     13 		return 0, err
     14 	}
     15 
     16 	pid, err = strconv.Atoi(string(data))
     17 	if err != nil {
     18 		return 0, err
     19 	}
     20 
     21 	if pid <= 0 {
     22 		return 0, errors.New("invalid pid")
     23 	}
     24 
     25 	// Check if the process is running.
     26 	// See man kill(2) for more information.
     27 	if err != nil && !errors.Is(err, syscall.EPERM) {
     28 		return 0, nil
     29 	}
     30 
     31 	return pid, nil
     32 }
     33 
     34 func Write(filename string) error {
     35 	pid, err := Read(filename)
     36 	if err != nil && !errors.Is(err, os.ErrNotExist) {
     37 		return err
     38 	}
     39 	if pid > 0 {
     40 		return errors.New("already running")
     41 	}
     42 
     43 	pid = os.Getpid()
     44 	data := []byte(strconv.Itoa(pid))
     45 
     46 	return os.WriteFile(filename, data, 0o0644)
     47 }