Optimize work with signals

This commit is contained in:
eleksir
2024-04-14 03:19:17 +03:00
parent e569c6bfce
commit b2788b9ef1
2 changed files with 31 additions and 85 deletions

92
main.go
View File

@@ -22,7 +22,7 @@ var pool *pond.WorkerPool
// Канал, в который приходят уведомления для хэндлера сигналов от траппера сигналов. // Канал, в который приходят уведомления для хэндлера сигналов от траппера сигналов.
var sigChan = make(chan os.Signal, 1) var sigChan = make(chan os.Signal, 1)
var kill = make(map[string]string) var kill = make(map[string]syscall.Signal)
var renice = make(map[string]int) var renice = make(map[string]int)
// main основная функция программы. // main основная функция программы.
@@ -101,103 +101,27 @@ func reniced(cnf Config) {
for _, p := range processList { for _, p := range processList {
ok := pool.TrySubmit(func() { ok := pool.TrySubmit(func() {
if processName, err := p.Name(); err == nil { if processName, err := p.Name(); err == nil {
if killSignal := kill[processName]; killSignal != "" { if killSignal := kill[processName]; killSignal != 0 {
switch killSignal { switch killSignal {
case "kill": case syscall.SIGSTOP:
_ = p.SendSignal(syscall.SIGKILL) _ = p.SendSignal(killSignal)
if cnf.Debug { if cnf.Debug {
log.Printf( log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent", "Matching processName with killProcessname (%s), SIG%s sent",
processName, processName,
strings.ToUpper(killSignal), strings.ToUpper(killSignal.String()),
) )
} }
case "stop":
if s, err := p.Status(); err == nil && s[0] != "stop" {
_ = p.SendSignal(syscall.SIGSTOP)
if cnf.Debug { default:
log.Printf( _ = p.SendSignal(killSignal)
"Matching processName with killProcessname (%s), SIG%s sent",
processName,
strings.ToUpper(killSignal),
)
}
} else if err == nil && s[0] == "stop" && cnf.Debug {
log.Printf(
"Matching processName with killProcessname (%s) and it is already stopped",
processName,
)
}
case "term":
_ = p.SendSignal(syscall.SIGTERM)
if cnf.Debug { if cnf.Debug {
log.Printf( log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent", "Matching processName with killProcessname (%s), SIG%s sent",
processName, processName,
strings.ToUpper(killSignal), strings.ToUpper(killSignal.String()),
)
}
case "int":
_ = p.SendSignal(syscall.SIGINT)
if cnf.Debug {
log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent",
processName,
strings.ToUpper(killSignal),
)
}
case "quit":
_ = p.SendSignal(syscall.SIGQUIT)
if cnf.Debug {
log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent",
processName,
strings.ToUpper(killSignal),
)
}
case "abrt":
_ = p.SendSignal(syscall.SIGABRT)
if cnf.Debug {
log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent",
processName,
strings.ToUpper(killSignal),
)
}
case "hup":
_ = p.SendSignal(syscall.SIGHUP)
if cnf.Debug {
log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent",
processName,
strings.ToUpper(killSignal),
)
}
case "usr1":
_ = p.SendSignal(syscall.SIGUSR1)
if cnf.Debug {
log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent",
processName,
strings.ToUpper(killSignal),
)
}
case "usr2":
_ = p.SendSignal(syscall.SIGUSR2)
if cnf.Debug {
log.Printf(
"Matching processName with killProcessname (%s), SIG%s sent",
processName,
strings.ToUpper(killSignal),
) )
} }
} }

24
util.go
View File

@@ -5,6 +5,7 @@ import (
"log" "log"
"os" "os"
"strings" "strings"
"syscall"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
@@ -96,7 +97,28 @@ func readConf(path string) (Config, error) {
switch v.Sig { switch v.Sig {
case "kill", "stop", "term", "int", "quit", "abrt", "hup", "usr1", "usr2": case "kill", "stop", "term", "int", "quit", "abrt", "hup", "usr1", "usr2":
for _, procName := range v.Name { for _, procName := range v.Name {
kill[procName] = v.Sig switch v.Sig {
case "kill":
kill[procName] = syscall.SIGKILL
case "stop":
kill[procName] = syscall.SIGSTOP
case "term":
kill[procName] = syscall.SIGTERM
case "int":
kill[procName] = syscall.SIGINT
case "quit":
kill[procName] = syscall.SIGQUIT
case "abrt":
kill[procName] = syscall.SIGABRT
case "hup":
kill[procName] = syscall.SIGHUP
case "usr1":
kill[procName] = syscall.SIGUSR1
case "usr2":
kill[procName] = syscall.SIGUSR2
default:
continue
}
if cfg.Debug { if cfg.Debug {
log.Printf( log.Printf(