|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"syscall"
|
|
|
|
|
|
|
|
"github.com/alexflint/go-arg"
|
|
|
|
common "source.heropunch.io/tomo/go-coreutils"
|
|
|
|
)
|
|
|
|
|
|
|
|
var BadSignalName = errors.New("bad signal name")
|
|
|
|
|
|
|
|
func selectSignal(signame string) (syscall.Signal, error) {
|
|
|
|
switch signame {
|
|
|
|
case "TERM":
|
|
|
|
return syscall.SIGTERM, nil
|
|
|
|
case "KILL":
|
|
|
|
return syscall.SIGKILL, nil
|
|
|
|
case "PIPE":
|
|
|
|
return syscall.SIGPIPE, nil
|
|
|
|
case "INT":
|
|
|
|
return syscall.SIGINT, nil
|
|
|
|
case "QUIT":
|
|
|
|
return syscall.SIGQUIT, nil
|
|
|
|
case "SEGV":
|
|
|
|
return syscall.SIGSEGV, nil
|
|
|
|
case "STOP":
|
|
|
|
return syscall.SIGSTOP, nil
|
|
|
|
case "CONT":
|
|
|
|
return syscall.SIGCONT, nil
|
|
|
|
case "0":
|
|
|
|
return 0, nil
|
|
|
|
case "ABRT":
|
|
|
|
return syscall.SIGABRT, nil
|
|
|
|
case "ALRM":
|
|
|
|
return syscall.SIGALRM, nil
|
|
|
|
case "BUS":
|
|
|
|
return syscall.SIGBUS, nil
|
|
|
|
case "CHLD":
|
|
|
|
return syscall.SIGCHLD, nil
|
|
|
|
case "FPE":
|
|
|
|
return syscall.SIGFPE, nil
|
|
|
|
case "HUP":
|
|
|
|
return syscall.SIGHUP, nil
|
|
|
|
case "ILL":
|
|
|
|
return syscall.SIGILL, nil
|
|
|
|
case "TSTP":
|
|
|
|
return syscall.SIGTSTP, nil
|
|
|
|
case "TTIN":
|
|
|
|
return syscall.SIGTTIN, nil
|
|
|
|
case "TTOU":
|
|
|
|
return syscall.SIGTTOU, nil
|
|
|
|
case "USR1":
|
|
|
|
return syscall.SIGUSR1, nil
|
|
|
|
case "USR2":
|
|
|
|
return syscall.SIGUSR2, nil
|
|
|
|
case "URG":
|
|
|
|
return syscall.SIGURG, nil
|
|
|
|
default:
|
|
|
|
return -1, BadSignalName
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
var args struct {
|
|
|
|
SignalName string `arg:"-s"`
|
|
|
|
List int `arg:"-l"`
|
|
|
|
PIDs []int `arg:"positional"`
|
|
|
|
}
|
|
|
|
|
|
|
|
args.SignalName = "TERM"
|
|
|
|
args.List = -1
|
|
|
|
|
|
|
|
p := arg.MustParse(&args)
|
|
|
|
if len(os.Args) == 1 {
|
|
|
|
p.WriteUsage(os.Stderr)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
sig, err := selectSignal(args.SignalName)
|
|
|
|
common.ExitIfError(err)
|
|
|
|
|
|
|
|
exitCode := 0
|
|
|
|
if len(args.PIDs) > 0 {
|
|
|
|
for _, pid := range args.PIDs {
|
|
|
|
err := syscall.Kill(pid, sig)
|
|
|
|
if err != nil {
|
|
|
|
common.PrintToStderr(fmt.Sprintf("kill %v: %v", pid, err))
|
|
|
|
exitCode = 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
os.Exit(exitCode)
|
|
|
|
}
|