@@ -36,6 +36,7 @@ var scriptCmds = map[string]func(*TestScript, bool, []string){
36
36
"exec" : (* TestScript ).cmdExec ,
37
37
"exists" : (* TestScript ).cmdExists ,
38
38
"grep" : (* TestScript ).cmdGrep ,
39
+ "kill" : (* TestScript ).cmdKill ,
39
40
"mkdir" : (* TestScript ).cmdMkdir ,
40
41
"mv" : (* TestScript ).cmdMv ,
41
42
"rm" : (* TestScript ).cmdRm ,
@@ -492,7 +493,69 @@ func (ts *TestScript) cmdUNIX2DOS(neg bool, args []string) {
492
493
}
493
494
}
494
495
495
- // Tait waits for background commands to exit, setting stderr and stdout to their result.
496
+ // cmdKill kills background commands.
497
+ func (ts * TestScript ) cmdKill (neg bool , args []string ) {
498
+ signals := map [string ]os.Signal {
499
+ "INT" : os .Interrupt ,
500
+ "KILL" : os .Kill ,
501
+ }
502
+ var (
503
+ name string
504
+ signal os.Signal
505
+ )
506
+ switch len (args ) {
507
+ case 0 :
508
+ case 1 , 2 :
509
+ sig , ok := strings .CutPrefix (args [0 ], "-" )
510
+ if ok {
511
+ signal , ok = signals [sig ]
512
+ if ! ok {
513
+ ts .Fatalf ("unknown signal: %s" , sig )
514
+ }
515
+ } else {
516
+ name = args [0 ]
517
+ break
518
+ }
519
+ if len (args ) == 2 {
520
+ name = args [1 ]
521
+ }
522
+ default :
523
+ ts .Fatalf ("usage: kill [-SIGNAL] [name]" )
524
+ }
525
+ if neg {
526
+ ts .Fatalf ("unsupported: ! kill" )
527
+ }
528
+ if signal == nil {
529
+ signal = os .Kill
530
+ }
531
+ if name != "" {
532
+ ts .killBackgroundOne (name , signal )
533
+ } else {
534
+ ts .killBackground (signal )
535
+ }
536
+ }
537
+
538
+ func (ts * TestScript ) killBackgroundOne (bgName string , signal os.Signal ) {
539
+ bg := ts .findBackground (bgName )
540
+ if bg == nil {
541
+ ts .Fatalf ("unknown background process %q" , bgName )
542
+ }
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
+ func (ts * TestScript ) killBackground (signal os.Signal ) {
550
+ for bgName , bg := range ts .background {
551
+ err := bg .cmd .Process .Signal (signal )
552
+ if err != nil {
553
+ ts .Fatalf ("unexpected error terminating background command %q: %v" , bgName , err )
554
+ }
555
+ }
556
+ }
557
+
558
+ // cmdWait waits for background commands to exit, setting stderr and stdout to their result.
496
559
func (ts * TestScript ) cmdWait (neg bool , args []string ) {
497
560
if len (args ) > 1 {
498
561
ts .Fatalf ("usage: wait [name]" )
0 commit comments