catch SIGTERM meant for running process

This commit is contained in:
Aidan 2020-06-27 21:54:14 -07:00
parent 3c2dde3665
commit d17e975cc8
No known key found for this signature in database
GPG key ID: 327711E983899316
3 changed files with 36 additions and 5 deletions

View file

@ -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(), "$")
}

View file

@ -18,6 +18,7 @@
package stdlib
import (
"os"
"git.callpipe.com/aidan/shs/ast"
)
@ -116,9 +117,9 @@ func GenFuncTable() ast.FuncTable {
},
"exit": &ast.Function{
Function: exit,
Function: exit_shell,
Name: "exit",
TimesCalled 0,
TimesCalled: 0,
Args: 0,
},
}