Як закінчити фоновий процес?


195

Я запустив wget на віддаленій машині у фоновому режимі &. Раптом завантаження припиняється. Я хочу припинити його процес, а потім повторно запустити команду. Як я можу його припинити?

Я не закрив його вікно оболонки. Але, як ви знаєте, це не перестає використовувати Ctrl+ Cі Ctrl+ Z.

Відповіді:


255

Є багато способів зробити це.

Спосіб №1 - пс

Ви можете скористатися psкомандою, щоб знайти ідентифікатор процесу для цього процесу, а потім використовувати PID, щоб вбити процес.

Приклад

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Спосіб №2 - pgrep

Ви також можете знайти ідентифікатор процесу, використовуючи pgrep.

Приклад

$ pgrep wget
1234

$ kill 1234

Спосіб №3 - pkill

Якщо ви впевнені, що це єдиний wgetзапуск, ви можете скористатися командою, pkillщоб вбити роботу на ім'я.

Приклад

$ pkill wget

Метод №4 - робочі місця

Якщо ви знаходитесь в тій же оболонці, з якої ви виконували роботу, яка зараз є фоном. Ви можете перевірити, чи працює він все ще за допомогою jobsкоманди, а також вбити її за своїм номером завдання.

Приклад

Моя фальшивка робота, sleep.

$ sleep 100 &
[1] 4542

Знайдіть номер роботи. ПРИМІТКА: номер 4542 - ідентифікатор процесу.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Метод №5 - фг

Ви можете повернути фонове завдання на перший план за допомогою fgкоманди.

Приклад

Підроблена робота, sleep.

$ sleep 100 &
[1] 4650

Отримайте номер роботи.

$ jobs
[1]+  Running                 sleep 100 &

Поверніть роботу №1 на перший план, а потім використовуйте Ctrl+ C.

$ fg 1
sleep 100
^C
$

Чи не jobsне мають outputі fg сай: -bash: fg: 1: no such job. Але введення тексту fgпрацює добре і також pkill wgetпрацює добре. але ps -eaf|grep wgetпотім kill <process number>доза не припиняє роботу. ps: Я використовую третє число як номер процесу .
Мохаммед Етемаддар

1
@MohammadEtemaddar - використовуйте 2-е число з виходу ps. 3-й номер - ідентифікатор батьківського процесу.
slm

1
@MohammadEtemaddar - ах, ps знаходить греп. Чи подобається це так: ps -eaef| grep [w]get.
slm

1
@MohammadEtemaddar - ви також можете використовувати pgrepзамість цього pgrep wget.
slm

2
@MohammadEtemaddar - вибачте, зайвий е помилковий. Слід прочитати ps -eaf | grep [w]get. Параметри знаходяться на psсторінці man. man ps.
slm

70

У bash ви можете використовувати, fgщоб вивести завдання на перший план, а потім використовувати Ctrl+C

Або перелічіть процес у фоновому режимі з, jobsа потім зробіть

kill %1

(з 1 замінено на число, яке jobsвам дали)


13

Ви можете однаковою мірою використовувати kill $!для вбивства останньої роботи, яку ви працювали останнім часом.


Якщо він використовується як команда, як псевдонім у профілі bash, обов'язково загортайте в окремі лапки.
Нейт Ріттер

6

EDIT: Опинившись на передньому плані, ви можете Ctrl+ C, або як згадує @Zelda, вбити за допомогою "% x", де "x" - номер завдання, надішле сигнал за замовчуванням (найімовірніше, SIGTERM у випадку Linux).

просто введіть його, fgщоб вивести його на перший план, якщо це був останній процес, у який ви фоновували (з "і").

Якщо вона була не останньою, введіть: jobsі знайдіть «номер завдання», представлений у «[]». Потім просто введіть:

fg 2

.. де '2' - номер роботи, наприклад:

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            <- this is now in the foreground.

4

Правильний спосіб - ввести, jobsа потім використовувати номер завдання, щоб вбити його. Для того, щоб використовувати pid для його вбивства, вам потрібно винести його на перший план, як зазначено в першій відповіді.

Спробуйте це

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Якщо ви запускаєте завдання одразу після того, як ви його убиєте, ви повинні це побачити

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

Я не бачу тут однієї речі, яка мені здається дуже корисною, особливо під час тестування команд pidof. Ви можете pidof [command]знайти ідентифікатор процесу, який зараз працює. Мені це подобається, тому що він дозволяє мені швидко знайти ідентифікатор команди, яку я хочу, і це, як правило, щось, на що я тільки посилався.

Після того, як у вас з’явиться під, ви можете просто вбити процес. Це дозволяє створити прості сценарії для вбивства процесу, лише якщо він зараз працює.


1
Ах, це мені допомогло! kill% 1 чомусь не працює, "kill: не вдалося проаналізувати аргумент: '% 1'" і Ctrl + C не працював; не вдалося знайти процес у PS чи що-небудь, тому що це root (я забув, що використовував
судо

1

Поширений приклад - stressінструмент. Скажімо, ви побігли наступне:

$ stress -c 4 -m 4 

і закрив вікно терміналу. Цей процес буде продовжувати харчуватися вашими ресурсами з другого фону.

Її я роблю:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrepперелічує PID підданого процесу і зберігає їх у змінну, xяку потім використовує kill -9для його припинення.


0

в bash останній зупинений процес (Ctrl-Z) ви вб'єте:

kill %%
kill -9 %%

або якщо хочете вибрати, використовуйте:

jobs

тоді:

kill %N

подібно до kill %2

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.