Sometimes, you need to run a command and kill if it runs too long.

The best approach I've found for doing this is to use a context with a timeout combined with exec.CommandContext:

package main
 
import (
"context"
"os/exec"
)
 
func main() {
 
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
 
cmd := exec.CommandContext(ctx, "sleep", "5")
 
out, err := cmd.CombinedOutput()
if (ctx.Err() != context.DeadlineExceeded) {
// Command was killed
}
if err != nil {
// If the command was killed, err will be "signal: killed"
// If the command wasn't killed, it contains the actual error, e.g. invalid command
}
 
}