mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
osutil: force SIG_DFL before resending terminating signal
The go runtime won't always reinstall the default signal handler on the SIGTERM path, so it's possible the signal won't terminate the process. Instead, force SIG_DFL for the signal.
This commit is contained in:
parent
90893735cf
commit
7a1739a3e8
@ -68,6 +68,7 @@ func HandleInterrupts() {
|
||||
if pid == 1 {
|
||||
os.Exit(0)
|
||||
}
|
||||
setDflSignal(sig.(syscall.Signal))
|
||||
syscall.Kill(pid, sig.(syscall.Signal))
|
||||
}()
|
||||
}
|
||||
|
@ -24,6 +24,9 @@ import (
|
||||
|
||||
var (
|
||||
plog = capnslog.NewPackageLogger("github.com/coreos/etcd", "pkg/osutil")
|
||||
|
||||
// support to override setting SIG_DFL so tests don't terminate early
|
||||
setDflSignal = dflSignal
|
||||
)
|
||||
|
||||
func Unsetenv(key string) error {
|
||||
|
@ -23,6 +23,8 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
func init() { setDflSignal = func(syscall.Signal) {} }
|
||||
|
||||
func TestUnsetenv(t *testing.T) {
|
||||
tests := []string{
|
||||
"data",
|
||||
|
19
pkg/osutil/signal.go
Normal file
19
pkg/osutil/signal.go
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2017 The etcd Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// +build !linux
|
||||
|
||||
package osutil
|
||||
|
||||
func dflSignal(sig syscall.Signal) { /* nop */ }
|
30
pkg/osutil/signal_linux.go
Normal file
30
pkg/osutil/signal_linux.go
Normal file
@ -0,0 +1,30 @@
|
||||
// Copyright 2017 The etcd Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// +build linux
|
||||
|
||||
package osutil
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// dflSignal sets the given signal to SIG_DFL
|
||||
func dflSignal(sig syscall.Signal) {
|
||||
// clearing out the sigact sets the signal to SIG_DFL
|
||||
var sigactBuf [32]uint64
|
||||
ptr := unsafe.Pointer(&sigactBuf)
|
||||
syscall.Syscall6(uintptr(syscall.SYS_RT_SIGACTION), uintptr(sig), uintptr(ptr), 0, 8, 0, 0)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user