- How to terminate a background process?
- 12 Answers 12
- Method #1 — ps
- Example
- Method #2 — pgrep
- Example
- Method #3 — pkill
- Example
- Method #4 — jobs
- Example
- Method #5 — fg
- Example
- Note
- e.g
- Как управлять фоновыми процессами в Linux
- bg: перемещение задачи в фон
- Как сразу приступить к выполнению команды в фоне
- jobs: команда для проверки задач в текущем терминале
- kill% n: прекращение выполнения задания с идентификатором n
- fg: команда для перемещения задачи в интерактивный режим
- Команда ps позволяет увидеть все процессы
- Выводы
How to terminate a background process?
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 .
12 Answers 12
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
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
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
Bring job #1 back to the foreground, and then use Ctrl + C .
@MohammadEtemaddar — use the 2nd number from the output of ps . The 3rd # is the parent’s process id.
@MohammadEtemaddar — sorry the extra e is a typo. Should read ps -eaf | grep [w]get . The options are are in the ps man page. man ps .
kill %% kills the last background process. Repeating it will kill the one before and so on. kill %1 kills the first background process.
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
(with 1 replaced by the number jobs gave you)
This sleeps the job. Not remove it. kill -9 %6 is the correct command that will remove the job number 6 . Number 9 indicates type of the signal that kill command sends.
You can equally use kill $! to kill the most recently backgrounded job.
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:
..where ‘2’ is the job number, for example:
foo@bar:~/junk/books$ jobs [1]+ Running okular how_to_cook_a_turkey.pdf & foo@bar:~/junk/books$ fg 1 okular how_to_cook_a_turkey.pdf
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.
Ah this helped me! kill %1 wasn't working for some reason, "kill: failed to parse argument: '%1'" and Ctrl+C wasn't working; couldn't find process in ps or anything because it was root (I forgot I used sudo with it)
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.
~/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
in bash last stopped process (Ctrl-Z) you will kill by:
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
- % 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 ( , 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 &
Как управлять фоновыми процессами в Linux
Если вы только начинаете работать с Linux и уже пробовали вводить команды в терминале, вы могли заметить, что для ввода каждой новой команды вам приходится ждать, пока уже начатый процесс завершится. Так происходит потому, что по умолчанию при запуске команды процесс начинается в активном окне терминала, — пишет сайт hexx.in.ua в своем переводе статьи «How to manage background processes in Linux».
Что делать, когда надо запустить другую команду? Можно открыть еще одну сессию терминала, но можно обойтись и без этого. Давайте рассмотрим, как управлять фоновыми и приоритетными процессами в Linux.
Но сначала давайте разберемся, что такое фоновый и приоритетный процесс.
Приоритетный процесс — это та задача, которую в настоящее время выполняется в активном окне терминала. То есть, приоритетным в каждой сессии терминала может быть только один процесс. Прежде чем начать новый приоритетный процесс, придется подождать окончания предыдущего.
Примером может быть выполнение любой команды в текущей сессии.
Фоновый процесс — это процесс или задача, которые выполняются в фоне и не требуют взаимодействия с пользователем. Фоновых процессов может быть много.
Наиболее распространенный пример процесса, работающего в фоне, — веб-сервер.
Давайте попробуем запустить команду vmstat.
shaikh@shaikhu-com:~$ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 3045156 167484 2449380 0 0 80 56 469 1138 19 5 76 0 0 1 0 0 3044644 167492 2450152 0 0 0 92 299 604 2 1 98
Эта команда показывает использование памяти и cpu в режиме реального времени. В качестве опции указываем 5 — это задержка перед выводом обновленных данных. Команда каждые 5 секунд будет выводить новую строку с данными, пока вы не прервете ее выполнение (пока не завершите начатый процесс). Для этого надо нажать CTL + C. А если вы хотите поставить процесс на паузу или остановить, надо нажать CTL + Z.
bg: перемещение задачи в фон
Предположим, вы хотите переместить в фон задание, выполнение которого уже началось (чтобы можно было делать в терминале что-то другое). Для этого надо нажать CTL + Z, а затем запустить команду bg (сокращение от background).
Давайте запустим выполнение какой-то приоритетной задачи. Например, будем записывать CPU-статистику в файл. Как видите, мы не можем ввести какую-то другую команду, поскольку эта задача выполняется в активном окне терминала (оно приоритетное).
shaikh@shaikhu-com:~$ vmstat 5 >> vmstat.txt
Давайте поставим эту задачу на паузу, нажав CTL + Z, а затем выполним команду bg.
shaikh@shaikhu-com:~$ vmstat 5 >> vmstat.txt ^Z [1]+ Stopped vmstat 5 >> vmstat.txt shaikh@shaikhu-com:~$ bg [1]+ vmstat 5 >> vmstat.txt & shaikh@shaikhu-com:~$
Теперь эта задача выполняется в фоне, а терминал свободен для введения новых команд.
Как сразу приступить к выполнению команды в фоне
Чтобы процесс запустился в фоне, после команды надо поставить знак &:
shaikh@shaikhucom:~$ sleep 400 & [2] 11122 shaikh@shaikhucom:~$
jobs: команда для проверки задач в текущем терминале
С помощью этой команды можно вывести все задачи, которые запущены в текущем терминале.
shaikh@shaikhucom:~$ jobs [1]- Running vmstat 5 >> vmstat.txt & [2]+ Running sleep 400 & shaikh@shaikhucom:~$
Номера в квадратных скобках [n] это номера (или идентификаторы) задач. Нумерация начинается с единицы. Знак «+» указывает на процесс, который был запущен последним, а «-» — на предпоследний процесс.
Если вы хотите увидеть идентификаторы самих процессов, надо использовать опцию -l:
shaikh@shaikhucom:~$ jobs -l [1]- 10216 Running vmstat 5 >> vmstat.txt & [2]+ 11122 Running sleep 400 & shaikh@shaikhucom:~$
Номера 10216 и 11122 — это идентификаторы процессов.
Возможные опции, которые можно использовать с командой jobs:
- -l — вывести список идентификаторов процессов в дополнение к обычной информации
- -n — перечислить только процессы, изменившие статус с последнего сообщения
- -r — ограничить вывод только запущенными задачами
- -s — ограничить вывод только остановленными задачами.
kill% n: прекращение выполнения задания с идентификатором n
Для прерывания заданий используется команда kill. Чтобы указать, какое именно задание надо прекратить выполнять, используется знак %, за которым следует номер задания.
haikh@shaikhu-com:~$ jobs [1]- Running vmstat 5 >> vmstat.txt & [2]+ Running sleep 400 & shaikh@shaikhucom:~$ kill %2 shaikh@shaikhucom:~$ jobs [1]+ Running vmstat 5 >> vmstat.txt & shaikh@shaikhucom:~$
Как видите, теперь у нас только один процесс в фоне. Причем знак «+» показывает, что это последняя из запущенных задач.
fg: команда для перемещения задачи в интерактивный режим
Чтобы переместить задачу в активное окно терминала (на передний план), используется команда fg (сокращение от foreground). По умолчанию (то есть, если не указать никаких опций), на передний план переместится процесс, который был запущен последним.
shaikh@shaikhucom:~$ jobs [1] Running vmstat 5 >> vmstat.txt & [2]- Running sleep 400 & [3]+ Running sleep 500 & shaikh@shaikhucom:~$ fg sleep 500 [2] Done sleep 400 shaikh@shaikhucom:~$
Если у вас в фоне выполняется больше одного процесса, можно указать номер задания, которое надо переместить на передний план.
Команда ps позволяет увидеть все процессы
Чтобы увидеть все активные процессы, используйте команду ps. При этом можно добавить следующие опции:
- ps ax — чтобы увидеть все процессы, недавно активные в системе. Список будет очень длинным, поэтому добавьте в конвейер less или more.
- ps T — чтобы увидеть все процессы, выполняемые в текущем терминале.
shaikh@shaikhucom:~$ ps T PID TTY STAT TIME COMMAND 5786 pts/0 Ss 0:00 bash 10216 pts/0 S 0:00 vmstat 5 12983 pts/0 R+ 0:00 ps T shaikh@shaikhucom:~$
Выводы
Мы рассмотрели команды, которые позволяют управлять фоновыми и приоритетными процессами:
- bg и fg — для перемещения задач в фон и обратно, в активное окно;
- jobs — для вывода списка активных задач в текущем терминале;
- kill — для прерывания процесса;
- ps — для вывода списка активных и запущенных процессов.
Мы также научились запускать задачи в фоне, добавив к команде знак &.