-
Notifications
You must be signed in to change notification settings - Fork 41
/
signaller.go
58 lines (46 loc) · 1.13 KB
/
signaller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package signals
import (
"fmt"
"os"
"syscall"
"code.cloudfoundry.org/garden"
)
//counterfeiter:generate . Signaller
type Signaller interface {
Signal(signal garden.Signal) error
}
type signaller struct {
pidFilePath string
pidGetter PidGetter
}
//counterfeiter:generate . PidGetter
type PidGetter interface {
Pid(pidFilePath string) (int, error)
}
type SignallerFactory struct {
PidGetter PidGetter
}
func (f *SignallerFactory) NewSignaller(pidfilePath string) Signaller {
return &signaller{pidFilePath: pidfilePath, pidGetter: f.PidGetter}
}
func (s *signaller) Signal(signal garden.Signal) error {
pid, err := s.pidGetter.Pid(s.pidFilePath)
if err != nil {
return fmt.Errorf("fetching-pid: %s", err)
}
process, err := os.FindProcess(pid)
if err != nil {
// Should never happen, os.FindProcess never returns an error on Linux
return fmt.Errorf("finding-process: %s", err)
}
return process.Signal(osSignal(signal).OsSignal())
}
type osSignal garden.Signal
func (s osSignal) OsSignal() syscall.Signal {
switch garden.Signal(s) {
case garden.SignalTerminate:
return syscall.SIGTERM
default:
return syscall.SIGKILL
}
}