Optimize work with signals
This commit is contained in:
94
main.go
94
main.go
@@ -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" {
|
default:
|
||||||
_ = p.SendSignal(syscall.SIGSTOP)
|
_ = 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()),
|
||||||
)
|
|
||||||
}
|
|
||||||
} 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 {
|
|
||||||
log.Printf(
|
|
||||||
"Matching processName with killProcessname (%s), SIG%s sent",
|
|
||||||
processName,
|
|
||||||
strings.ToUpper(killSignal),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
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
24
util.go
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user