You have few options. One is to stop the script (CtrlZ), get the PID of the script and send
SIGKILL to the process group.
When a command is executed in a shell, the process it starts and all its children are part of the same process group (in this case, the foreground process group). To send a signal to all processes in this group, you send it to the process leader. For the
kill command, process leader is denoted thus:
PID is the process ID of the script.
Consider a script
test.sh which launches some processes. Say you ran it in a shell:
In another terminal,
$ pgrep test.sh
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
In this case, to send a signal to process group created by
test.sh, you'd do:
kill -INT -17802
-INT is used to send
SIGINT, and so this command is the equivalent of pressing CtrlC on the terminal. To send
kill -KILL -17802
You only need to stop the script if you can't open another terminal. If you can, use
pgrep to find the PID.
One of the commands that the script launches may be trapping
SIGINT, which is probably why CtrlC is ineffective. However,
SIGKILL can't be trapped, and it is usually a last-resort option. You might want to try
-TERM) before going for the kill. Neither
SIGTERM can be set up as a keyboard shortcut the way
All this is moot if your script doesn't contain a shebang line. From this SO answer:
Usually the parent shell guesses that the script is written for the the same shell (minimal Bourne-like shells run the script with /bin/sh, bash runs it as a bash subprocess) ...
Because of this, when the script is executed, you won't find a process named after script (or a process with the script's name in the command line) and
pgrep will fail.
Always use a shebang line.
Ctrl + z
Ctrl + zrun:
kill -9 $(pgrep -f your_script.sh)