37 lines
676 B
Go
37 lines
676 B
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"syscall"
|
|
)
|
|
|
|
func getCmd(ctx context.Context, cmd string) *exec.Cmd {
|
|
return exec.CommandContext(ctx, cmd, "serve")
|
|
}
|
|
|
|
func terminate(cmd *exec.Cmd) error {
|
|
return cmd.Process.Signal(os.Interrupt)
|
|
}
|
|
|
|
func isProcessExited(pid int) (bool, error) {
|
|
proc, err := os.FindProcess(pid)
|
|
if err != nil {
|
|
return false, fmt.Errorf("failed to find process: %v", err)
|
|
}
|
|
|
|
err = proc.Signal(syscall.Signal(0))
|
|
if err != nil {
|
|
if errors.Is(err, os.ErrProcessDone) || errors.Is(err, syscall.ESRCH) {
|
|
return true, nil
|
|
}
|
|
|
|
return false, fmt.Errorf("error signaling process: %v", err)
|
|
}
|
|
|
|
return false, nil
|
|
}
|