catch SIGTERM meant for running process
This commit is contained in:
parent
3c2dde3665
commit
d17e975cc8
3 changed files with 36 additions and 5 deletions
|
|
@ -22,6 +22,8 @@ import (
|
|||
"fmt"
|
||||
"bytes"
|
||||
"os/exec"
|
||||
"syscall"
|
||||
"os/signal"
|
||||
"git.callpipe.com/aidan/shs/ast"
|
||||
"git.callpipe.com/aidan/shs/log"
|
||||
)
|
||||
|
|
@ -58,9 +60,18 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Stdin = os.Stdin
|
||||
|
||||
exit := 0
|
||||
|
||||
signalChan := make(chan os.Signal, 2)
|
||||
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
|
||||
go func() {
|
||||
sig := <-signalChan
|
||||
cmd.Process.Signal(sig)
|
||||
}()
|
||||
|
||||
err = cmd.Run()
|
||||
close(signalChan)
|
||||
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||
if err != nil {
|
||||
if exitError, ok := err.(*exec.ExitError); ok {
|
||||
exit = exitError.ExitCode()
|
||||
|
|
@ -117,7 +128,17 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
cmd.Stdout = os.Stdout
|
||||
cmd.Stdin = os.Stdin
|
||||
exit := 0
|
||||
|
||||
signalChan := make(chan os.Signal, 2)
|
||||
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
|
||||
go func() {
|
||||
sig := <-signalChan
|
||||
cmd.Process.Signal(sig)
|
||||
}()
|
||||
|
||||
err := cmd.Wait()
|
||||
close(signalChan)
|
||||
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||
if err != nil {
|
||||
if exitError, ok := err.(*exec.ExitError); ok {
|
||||
exit = exitError.ExitCode()
|
||||
|
|
@ -161,7 +182,16 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
cmd.Stderr = os.Stderr
|
||||
cmd.Stdin = os.Stdin
|
||||
|
||||
signalChan := make(chan os.Signal, 2)
|
||||
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
|
||||
go func() {
|
||||
sig := <-signalChan
|
||||
cmd.Process.Signal(sig)
|
||||
}()
|
||||
|
||||
err = cmd.Run()
|
||||
close(signalChan)
|
||||
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||
if err != nil {
|
||||
log.Log(log.ERR, err.Error(), "$")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
package stdlib
|
||||
|
||||
import (
|
||||
"os"
|
||||
"git.callpipe.com/aidan/shs/ast"
|
||||
)
|
||||
|
||||
|
|
@ -116,10 +117,10 @@ func GenFuncTable() ast.FuncTable {
|
|||
},
|
||||
|
||||
"exit": &ast.Function{
|
||||
Function: exit,
|
||||
Name: "exit",
|
||||
TimesCalled 0,
|
||||
Args: 0,
|
||||
Function: exit_shell,
|
||||
Name: "exit",
|
||||
TimesCalled: 0,
|
||||
Args: 0,
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue