I have started a wget on remote machine in background using &. Suddenly it stops downloading. I want to terminate its process, then re-run the command. How can I terminate it?
I haven’t closed its shell window. But as you know it doesn’t stop using Ctrl+C and Ctrl+Z.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
There are many ways to go about this.
Method #1 – ps
You can use the ps command to find the process ID for this process and then use the PID to kill the process.
Example
$ ps -eaf | grep [w]get saml 1713 1709 0 Dec10 pts/0 00:00:00 wget ... $ kill 1713
Method #2 – pgrep
You can also find the process ID using pgrep.
Example
$ pgrep wget 1234 $ kill 1234
Method #3 – pkill
If you’re sure it’s the only wget you’ve run you can use the command pkill to kill the job by name.
Example
$ pkill wget
Method #4 – jobs
If you’re in the same shell from where you ran the job that’s now backgrounded. You can check if it’s running still using the jobs command, and also kill it by its job number.
Example
My fake job, sleep.
$ sleep 100 & [1] 4542
Find it’s job number. NOTE: the number 4542 is the process ID.
$ jobs [1]+ Running sleep 100 & $ kill %1 [1]+ Terminated sleep 100
Method #5 – fg
You can bring a backgrounded job back to the foreground using the fg command.
Example
Fake job, sleep.
$ sleep 100 & [1] 4650
Get the job’s number.
$ jobs [1]+ Running sleep 100 &
Bring job #1 back to the foreground, and then use Ctrl+C.
$ fg 1 sleep 100 ^C $
Method 2
In bash you can use fg to get the job to the foreground and then use Ctrl+C
Or list the process in the background with jobs and then do
kill %1
(with 1 replaced by the number jobs gave you)
Method 3
You can equally use kill $! to kill the most recently backgrounded job.
Method 4
EDIT: Once in the foreground, you can Ctrl+C, or as @Zelda mentions, kill with the ‘%x’ where ‘x’ is the job number will send the default signal (most likely SIGTERM in the case of Linux).
just type fg to bring it to the foreground, if it was the last process you backgrounded (with ‘&’).
If it was not the last one, type: jobs and find the ‘job number’, represented in ‘[]’. Then just type:
fg 2
..where ‘2’ is the job number, for example:
<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dcbab3b39cbebdae">[email protected]</a>:~/junk/books$ jobs [1]+ Running okular how_to_cook_a_turkey.pdf & <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6600090926040714">[email protected]</a>:~/junk/books$ fg 1 okular how_to_cook_a_turkey.pdf <- this is now in the foreground.
Method 5
One thing I don’t see here, which I’ve found very useful especially when testing out commands, is pidof. You can use pidof [command] to find the process id of a process that is currently running. I like it because it allows me to quickly find the id of the command I want, which is usually something I just invoked.
Once you have the pid, you can simply kill the process. It allows for creating simple scripts for killing a process only if it’s currently running.
Method 6
The correct way is to type jobs then use the job number to kill it. In order to use the pid to kill it you need to bring it to the foreground as noted in the first answer.
Try this
~/Desktop$ sleep 1000 & [1] 7056 ~/Desktop$ jobs [1]+ Running sleep 1000 & /Desktop$ kill %1 #(%1 is the job number)
If you run jobs right after you kill it you should see this
Desktop$ jobs [1]+ Terminated sleep 1000
Method 7
in bash last stopped process (Ctrl-Z) you will kill by:
kill %% kill -9 %%
or if want to choose, use:
jobs
then:
kill %N
like kill %2
Method 8
A common example is the stress tool. Let say you ran the following:
$ stress -c 4 -m 4
and closed the terminal window. The process would continue eating your resources from the background.
Hers’s what I do:
$ x=`pgrep stress` ; sudo kill -9 $x
pgrep lists the PIDs of the subjected process and stores it into variable x which then used by kill -9 to terminate it.
Method 9
The Easiest way is to use -9 flag on kill command
<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c4b1b7a1b684acabb7b0">[email protected]</a>:/path> jobs [1]+ Running /usr/home/script1.sh $i & <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a6f697f685a7275696e">[email protected]</a>:/path> fg /usr/home/script1.sh $i ^C [1]+ Stopped /usr/home/script1.sh $i <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fb8e889e89bb9394888f">[email protected]</a>:/path> kill -9 %1 [1]+ Stopped /usr/home/script1.sh $i <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f085839582b0989f8384">[email protected]</a>:/path> [1]+ Killed /usr/home/script1.sh $i <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fb8e889e89bb9394888f">[email protected]</a>:/path> <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4b3e382e390b2324383f">[email protected]</a>:/path> jobs <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0277716770426a6d7176">[email protected]</a>:/path>
Method 10
It’s an old question and there are already few good answers, but, I’ll try to present mine in a little different way.
Actually, backgrounded processes are called jobs, and job control is very well explained in those 3 short pages: https://www.gnu.org/software/bash/manual/html_node/Job-Control.html
Basically, we can reference a job by a jobspec, that is the symbol % follow either by another symbol (or a sequence in some fancier cases), or by a job ID. And it’s the same for kill, fg, bg or disown.
%+(or just%, or%%) will reference the latest backgrounded
job (current)%-will reference the previous one%{jobid}will reference the specified job
To list your backgrounded jobs, you use the command jobs.
Note
kill $! has a different behavior, it will kill the latest process sent in the background as a job, and not the latest job created.
e.g
You have sent 5 jobs in the background.
You bring back job #2 in the foreground (fg %2, or just %2), then sent it back in the background (<Ctrl-Z>, then bg).
It is the latest process sent to the background, but it remains job #2.
So that kill $! will terminate job #2 – the latest process (re)sent to the background, while kill %+ will kill job #5, the latest job that have been created (“current job”):
$ jobs [1] Running sleep 1000 & [2] Running sleep 2000 & [3] Running sleep 3000 & [4]- Running sleep 4000 & [5]+ Running sleep 5000 & $ fg %2 sleep 2000 ^Z [2]+ Stopped sleep 2000 $ bg [2]+ sleep 2000 & $ jobs [1] Running sleep 1000 & [2] Running sleep 2000 & [3] Running sleep 3000 & [4]- Running sleep 4000 & [5]+ Running sleep 5000 & $ kill %+ $ jobs [1] Running sleep 1000 & [2] Running sleep 2000 & [3] Running sleep 3000 & [4]- Running sleep 4000 & [5]+ Terminated sleep 5000 $ kill $! [2] Terminated sleep 2000 $ jobs [1] Running sleep 1000 & [3]- Running sleep 3000 & [4]+ Running sleep 4000 &
Method 11
List All Jobs by typing
jobs
Output>>[1]+ Stopped sudo nano ls.txt
Take this process to foreground and kill
fg %1 then press ctrl+c
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0