Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

trap os.Exit in golang

Tags:

go

I can run some cleanup on interruption (when I press ctrlc).

$ go build 
$ ./exit
^Creceived interrupt signal

Is it possible to trap the same way os.Exit call and run some code before program exits? The code:

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    handleInterrupt(2)
    time.Sleep(2 * time.Second)
    os.Exit(1) // how to trap it?
}
func handleInterrupt(intrptChSize int) {
    s := make(chan os.Signal, intrptChSize)
    signal.Notify(s,
        syscall.SIGABRT,
        syscall.SIGALRM,
        syscall.SIGBUS,
        syscall.SIGCHLD,
        syscall.SIGCONT,
        syscall.SIGEMT,
        syscall.SIGFPE,
        syscall.SIGHUP,
        syscall.SIGILL,
        syscall.SIGINFO,
        syscall.SIGINT,
        syscall.SIGIO,
        syscall.SIGIOT,
        syscall.SIGKILL,
        syscall.SIGPIPE,
        syscall.SIGPROF,
        syscall.SIGQUIT,
        syscall.SIGSEGV,
        syscall.SIGSTOP,
        syscall.SIGSYS,
        syscall.SIGTERM,
        syscall.SIGTRAP,
        syscall.SIGTSTP,
        syscall.SIGTTIN,
        syscall.SIGTTOU,
        syscall.SIGURG,
        syscall.SIGUSR1,
        syscall.SIGUSR2,
        syscall.SIGVTALRM,
        syscall.SIGWINCH,
        syscall.SIGXCPU,
        syscall.SIGXFSZ)
    go func() {
        for sig := range s {
            fmt.Printf("received %s signal\n", sig)
            //cleanup()
        }
    }()
}

I know I can just run cleanup before each os.Exit() code manually in this example:

cleanup()
os.Exit(1)

But in my real project I am importing code which I cannot edit. This code contains os.Exit calls and I would like to do some cleanup before the program exits without editing imported code.

like image 517
Maxim Yefremov Avatar asked Mar 12 '23 03:03

Maxim Yefremov


1 Answers

You can't. from TFM:

The program terminates immediately; deferred functions are not run.

like image 188
Not_a_Golfer Avatar answered Mar 19 '23 07:03

Not_a_Golfer