How do I kill all subprocesses spawned by my bash script?

I have a script that looks like this. Invoked with ./myscript.sh start

#!/bin/bash
if [[ "$1" == "start" ]]; then
  echo "Dev start script process ID: $$"

  cd /my/path1
  yarn dev &> /my/path/logs/log1.log &
  echo "started process1 in background"
  echo "Process ID: $!"
  echo "Logging output at logs/log1.log"
  sleep 2

  cd /my/path2
  yarn start:dev &> /my/path/logs/log2.log &
  echo "started process2 in background"
  echo "Process ID: $!"
  echo "Logging output at logs/log2.log"
  sleep 2

  cd /my/path2
  yarn dev &> /my/path/logs/log3.log &
  echo "started process3 in background"
  echo "Process ID: $!"
  echo "Logging output at logs/log3.log"
elif [[ "$1" == "stop" ]]; then
  killList=`ps  | grep node | awk '{print $1}'`
  if [[ $killList != "" ]]; then
      echo $killList | xargs kill
      echo  "Processes killed: $killList"
  else
      echo "Nothing to stop"
  fi
else
  echo "Invalid argument"
fi

When i run ps after I run this script, i can see a bunch of node processes (more than 3) that I assume has been started by the yarn dev commands. I want to run ./myscript.sh stop and stop all the node processes that were spawned from my previous run of ./myscript.sh start

How do I make this happen?

Asked By: Jay Pillai

||

You could get the list of processes directly spawned from that bash and send SIGTERM to them:

pgrep -P $$ --signal SIGTERM

$$ is the process number of the current bash script.

Depending on how the signal is treated by the child processes, that might or not kill the grandchild processes (and so on, recursively).

So another way to do it is to get list the whole tree of processes starting at your bash and then kill them.

pstree -A -p $$ | grep -Eow "[0-9]+" | xargs kill

pstree outputs the tree (formatted for humans), grep extracts the process numbers and then you do what you need to do with them, for example running kill for each one.

Note that with the line above pstree will also list the grep and xargs processes, so you will have two No such process warnings from kill. Not sure if there is a race condition, that’s just a proof of concept. You can code the right side of the pipeline to deal with the list of processes properly, filter, etc.

Answered By: Eduardo Trápani