简体   繁体   中英

golang exec a command on a running binary / process

If you look at Nginx it calls "nginx reload" to reload itself. Is there any way to send a signal from the command line to a running process? Even if the main process starts child processes how can I send commands to the main to notify its children?

ex:

myapp start -debug // starts a server
myapp reload -gracefull // stops the app gracefully

Now i need to send os signals to notify my server to perform a graceful shutdown

kill -QUIT pid
kill -USR2 pid

I hope my question is clear enough Thnx

Receive signals

Take a look at the os/signal package.

Package signal implements access to incoming signals.

There is even an example in the documentation :

// Set up channel on which to send signal notifications.
// We must use a buffered channel or risk missing the signal
// if we're not ready to receive when the signal is sent.
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)

// Block until a signal is received.
s := <-c
fmt.Println("Got signal:", s)

Send signals

To see how to send signals take a look at signal_test.go , it uses syscall . For example :

// Send this process a SIGHUP
t.Logf("sighup...")
syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
waitSig(t, c, syscall.SIGHUP)

I figured out that in go i we can pass the environment to syscall.Exec

err := syscall.Exec(argv0. os.Args. os.Environ())

simply copies the current env to the child process.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM