How to check if a Go program isn't running via the go run command?

Issue

I want to know if there is a non OS-specific way to test if a Go program is launched by using the go run command or by executing the binary produced by the go build command.

Solution

First: it’s always compiled.

Second: There is no guaranteed way to tell the difference between binaries compiled using go build and go run.

go run main.go just builds a temporary binary and executes it.

You can look at the path of the binary being executed by printing os.Args[0] (the first argument). eg for the following program:

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println(os.Args[0])
}
$ go run main.go
/tmp/go-build854217312/b001/exe/main

$  go build -o main . && ./main
./main

You could try to detect the fact that the first one is in a temporary directory but the location will depend on the OS and is not guaranteed to remain the same across go versions.

Overall, it might not be worth it. go run is not acceptable for any serious binary, it should always be compiled.

Answered By – Marc

Answer Checked By – Terry (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.