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"
|
"fmt"
|
||||||
"bytes"
|
"bytes"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"syscall"
|
||||||
|
"os/signal"
|
||||||
"git.callpipe.com/aidan/shs/ast"
|
"git.callpipe.com/aidan/shs/ast"
|
||||||
"git.callpipe.com/aidan/shs/log"
|
"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.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Stdin = os.Stdin
|
cmd.Stdin = os.Stdin
|
||||||
|
|
||||||
exit := 0
|
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()
|
err = cmd.Run()
|
||||||
|
close(signalChan)
|
||||||
|
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if exitError, ok := err.(*exec.ExitError); ok {
|
if exitError, ok := err.(*exec.ExitError); ok {
|
||||||
exit = exitError.ExitCode()
|
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.Stdout = os.Stdout
|
||||||
cmd.Stdin = os.Stdin
|
cmd.Stdin = os.Stdin
|
||||||
exit := 0
|
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()
|
err := cmd.Wait()
|
||||||
|
close(signalChan)
|
||||||
|
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if exitError, ok := err.(*exec.ExitError); ok {
|
if exitError, ok := err.(*exec.ExitError); ok {
|
||||||
exit = exitError.ExitCode()
|
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.Stderr = os.Stderr
|
||||||
cmd.Stdin = os.Stdin
|
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()
|
err = cmd.Run()
|
||||||
|
close(signalChan)
|
||||||
|
signal.Reset(os.Interrupt, syscall.SIGTERM)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Log(log.ERR, err.Error(), "$")
|
log.Log(log.ERR, err.Error(), "$")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
package stdlib
|
package stdlib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"git.callpipe.com/aidan/shs/ast"
|
"git.callpipe.com/aidan/shs/ast"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -116,9 +117,9 @@ func GenFuncTable() ast.FuncTable {
|
||||||
},
|
},
|
||||||
|
|
||||||
"exit": &ast.Function{
|
"exit": &ast.Function{
|
||||||
Function: exit,
|
Function: exit_shell,
|
||||||
Name: "exit",
|
Name: "exit",
|
||||||
TimesCalled 0,
|
TimesCalled: 0,
|
||||||
Args: 0,
|
Args: 0,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue