Skip to content

Instantly share code, notes, and snippets.

@wooramel
Forked from davidnewhall/pidfile_snippet.go
Created April 18, 2019 01:49
Show Gist options
  • Save wooramel/76899fcdf667b15ab073a6df6ab2e8eb to your computer and use it in GitHub Desktop.
Save wooramel/76899fcdf667b15ab073a6df6ab2e8eb to your computer and use it in GitHub Desktop.
How to write a PID file in Golang.
// Write a pid file, but first make sure it doesn't exist with a running pid.
func writePidFile(pidFile string) error {
// Read in the pid file as a slice of bytes.
if piddata, err := ioutil.ReadFile(pidFile); err == nil {
// Convert the file contents to an integer.
if pid, err := strconv.Atoi(string(piddata)); err == nil {
// Look for the pid in the process list.
if process, err := os.FindProcess(pid); err == nil {
// Send the process a signal zero kill.
if err := process.Signal(syscall.Signal(0)); err == nil {
// We only get an error if the pid isn't running, or it's not ours.
return fmt.Errorf("pid already running: %d", pid)
}
}
}
}
// If we get here, then the pidfile didn't exist,
// or the pid in it doesn't belong to the user running this app.
return ioutil.WriteFile(pidFile, []byte(fmt.Sprintf("%d", os.Getpid())), 0664)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment