parent
5fc2672d64
commit
8a28fc42f2
1 changed files with 102 additions and 0 deletions
@ -0,0 +1,102 @@ |
||||
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 { |
||||
process, err := os.FindProcess(pid) |
||||
if err != nil { |
||||
common.PrintToStderr(fmt.Sprintf("error finding process %v: %v", pid, err)) |
||||
exitCode = 1 |
||||
continue |
||||
} |
||||
err = process.Signal(sig) |
||||
if err != nil { |
||||
common.PrintToStderr(fmt.Sprintf("kill %v: %v", pid, err)) |
||||
exitCode = 1 |
||||
} |
||||
} |
||||
} |
||||
os.Exit(exitCode) |
||||
} |
Loading…
Reference in new issue