| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // Copyright 2015 CoreOS, Inc.
- //
- // 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.
- package osutil
- import (
- "log"
- "os"
- "os/signal"
- "strings"
- "sync"
- "syscall"
- )
- func Unsetenv(key string) error {
- envs := os.Environ()
- os.Clearenv()
- for _, e := range envs {
- strs := strings.SplitN(e, "=", 2)
- if strs[0] == key {
- continue
- }
- if err := os.Setenv(strs[0], strs[1]); err != nil {
- return err
- }
- }
- return nil
- }
- // InterruptHandler is a function that is called on receiving a
- // SIGTERM or SIGINT signal.
- type InterruptHandler func()
- var (
- interruptRegisterMu, interruptExitMu sync.Mutex
- // interruptHandlers holds all registered InterruptHandlers in order
- // they will be executed.
- interruptHandlers = []InterruptHandler{}
- )
- // RegisterInterruptHandler registers a new InterruptHandler. Handlers registered
- // after interrupt handing was initiated will not be executed.
- func RegisterInterruptHandler(h InterruptHandler) {
- interruptRegisterMu.Lock()
- defer interruptRegisterMu.Unlock()
- interruptHandlers = append(interruptHandlers, h)
- }
- // HandleInterrupts calls the handler functions on receiving a SIGINT or SIGTERM.
- func HandleInterrupts() {
- notifier := make(chan os.Signal, 1)
- signal.Notify(notifier, syscall.SIGINT, syscall.SIGTERM)
- go func() {
- sig := <-notifier
- interruptRegisterMu.Lock()
- ihs := make([]InterruptHandler, len(interruptHandlers))
- copy(ihs, interruptHandlers)
- interruptRegisterMu.Unlock()
- interruptExitMu.Lock()
- log.Printf("received %v signal, shutting down", sig)
- for _, h := range ihs {
- h()
- }
- signal.Stop(notifier)
- syscall.Kill(syscall.Getpid(), sig.(syscall.Signal))
- }()
- }
- // Exit relays to os.Exit if no interrupt handlers are running, blocks otherwise.
- func Exit(code int) {
- interruptExitMu.Lock()
- os.Exit(code)
- }
|