@@ -35,6 +35,7 @@ var scriptCmds = map[string]func(*TestScript, bool, []string){
3535 "exec" : (* TestScript ).cmdExec ,
3636 "exists" : (* TestScript ).cmdExists ,
3737 "grep" : (* TestScript ).cmdGrep ,
38+ "kill" : (* TestScript ).cmdKill ,
3839 "mkdir" : (* TestScript ).cmdMkdir ,
3940 "mv" : (* TestScript ).cmdMv ,
4041 "rm" : (* TestScript ).cmdRm ,
@@ -484,7 +485,69 @@ func (ts *TestScript) cmdUNIX2DOS(neg bool, args []string) {
484485 }
485486}
486487
487- // Tait waits for background commands to exit, setting stderr and stdout to their result.
488+ // cmdKill kills background commands.
489+ func (ts * TestScript ) cmdKill (neg bool , args []string ) {
490+ signals := map [string ]os.Signal {
491+ "INT" : os .Interrupt ,
492+ "KILL" : os .Kill ,
493+ }
494+ var (
495+ name string
496+ signal os.Signal
497+ )
498+ switch len (args ) {
499+ case 0 :
500+ case 1 , 2 :
501+ sig , ok := strings .CutPrefix (args [0 ], "-" )
502+ if ok {
503+ signal , ok = signals [sig ]
504+ if ! ok {
505+ ts .Fatalf ("unknown signal: %s" , sig )
506+ }
507+ } else {
508+ name = args [0 ]
509+ break
510+ }
511+ if len (args ) == 2 {
512+ name = args [1 ]
513+ }
514+ default :
515+ ts .Fatalf ("usage: kill [-SIGNAL] [name]" )
516+ }
517+ if neg {
518+ ts .Fatalf ("unsupported: ! kill" )
519+ }
520+ if signal == nil {
521+ signal = os .Kill
522+ }
523+ if name != "" {
524+ ts .killBackgroundOne (name , signal )
525+ } else {
526+ ts .killBackground (signal )
527+ }
528+ }
529+
530+ func (ts * TestScript ) killBackgroundOne (bgName string , signal os.Signal ) {
531+ bg := ts .findBackground (bgName )
532+ if bg == nil {
533+ ts .Fatalf ("unknown background process %q" , bgName )
534+ }
535+ err := bg .cmd .Process .Signal (signal )
536+ if err != nil {
537+ ts .Fatalf ("unexpected error terminating background command %q: %v" , bgName , err )
538+ }
539+ }
540+
541+ func (ts * TestScript ) killBackground (signal os.Signal ) {
542+ for bgName , bg := range ts .background {
543+ err := bg .cmd .Process .Signal (signal )
544+ if err != nil {
545+ ts .Fatalf ("unexpected error terminating background command %q: %v" , bgName , err )
546+ }
547+ }
548+ }
549+
550+ // cmdWait waits for background commands to exit, setting stderr and stdout to their result.
488551func (ts * TestScript ) cmdWait (neg bool , args []string ) {
489552 if len (args ) > 1 {
490553 ts .Fatalf ("usage: wait [name]" )
0 commit comments