I have written a bash script that calls several other programs and executes a bunch of commands. I run this script from the terminal. Now I want to kill the script.
Pressing Ctrl + C
sometimes doesn't cut it, I think because sometimes the script is executing another program, and for some reason the kill signal doesn't work.
However, if I close the terminal window, it kills the script.
Is there something I can do (a keyboard combination), that is analogous to closing the terminal window, without actually closing the terminal window (I don't want to lose command history, current directory, output history, etc.)?
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:Where
PID
is the process ID of the script.Example:
Consider a script
test.sh
which launches some processes. Say you ran it in a shell:In another terminal,
In this case, to send a signal to process group created by
test.sh
, you'd do:-INT
is used to sendSIGINT
, and so this command is the equivalent of pressing CtrlC on the terminal. To sendSIGKILL
: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 trySIGTERM
(-TERM
) before going for the kill. NeitherSIGKILL
orSIGTERM
can be set up as a keyboard shortcut the waySIGINT
is.All this is moot if your script doesn't contain a shebang line. From this SO answer:
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.
If you know the processes that are associated with the script you can find their PID using
and then use the PID number to kill the corresponding processes using
As Harris said you could run
Kill -9 PID_Number
but you could also install the package known ashtop
to have an interactive process browser that makes finding specific processes a lot easier. htop also supports killing processes.