Implement kill -s
This commit is contained in:
parent
5fc2672d64
commit
8a28fc42f2
102
kill/kill.go
Normal file
102
kill/kill.go
Normal file
@ -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
Block a user