Как прекратить фоновый процесс?

196

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

Я не закрыл окно его оболочки. Но, как вы знаете, он не перестает использовать Ctrl+ Cи Ctrl+ Z.

Мухаммед Этемаддар
источник

Ответы:

256

Есть много способов сделать это.

Способ № 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 - Пкилл

Если вы уверены, что это единственное, что 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
$
SLM
источник
Не jobsне имеют outputи fg сай: -bash: fg: 1: no such job. Но набор текста fgработает хорошо, а также pkill wgetработает хорошо. но ps -eaf|grep wgetи тогда kill <process number>доза не остановит работу. PS: я использую третий номер в качестве номера процесса .
Мухаммед Этемаддар
1
@MohammadEtemaddar - использовать 2-е число из выходных данных ps. Третий # - это идентификатор процесса родителя.
SLM
1
@MohammadEtemaddar - ах, пс находит Греп. Нравится ли это так: ps -eaef| grep [w]get.
SLM
1
@MohammadEtemaddar - вы также можете использовать pgrepвместо pgrep wget.
SLM
2
@MohammadEtemaddar - извините, дополнительная е - опечатка. Должен прочитать ps -eaf | grep [w]get. Опции находятся на psстранице руководства . man ps,
SLM
70

В bash вы можете использовать, fgчтобы вывести задание на передний план, а затем использовать Ctrl+C

Или перечислите процесс в фоновом режиме, jobsа затем выполните

kill %1

(с 1 заменен на номер jobsдал вам)

Zelda
источник
13

Вы можете в равной степени использовать, kill $!чтобы убить самую последнюю заднюю работу.

tek0078
источник
Если она используется в качестве команды, такой как псевдоним в профиле bash, обязательно заключите ее в одинарные кавычки.
Нейт Риттер
6

РЕДАКТИРОВАТЬ: Оказавшись на переднем плане, вы можете Ctrl+ Cили, как упоминает @Zelda, уничтожить с помощью «% x», где «x» - номер задания, который отправит сигнал по умолчанию (наиболее вероятно, SIGTERM в случае Linux).

просто напечатайте, fgчтобы вывести его на передний план, если это был последний процесс, который вы сделали в фоновом режиме (с '&').

Если это был не последний, введите: jobsи найдите «номер задания», представленный в «[]». Затем просто введите:

fg 2

..where '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затем использовать номер задания, чтобы убить его. Чтобы убить его, вы должны вынести его на передний план, как отмечено в первом ответе.

Попробуй это

~/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]чтобы найти идентификатор процесса, который запущен в данный момент. Мне это нравится, потому что это позволяет мне быстро найти идентификатор команды, которую я хочу, и это обычно то, что я только что вызвал.

Получив pid, вы можете просто убить процесс. Он позволяет создавать простые сценарии для уничтожения процесса, только если он запущен в данный момент.

Try431
источник
1
Ах, это помогло мне! kill% 1 по какой-то причине не работал, "kill: не удалось проанализировать аргумент:"% 1 "", а Ctrl + C не работал; Не удалось найти процесс в PS или что-то еще, потому что это был root (я забыл, что использовал sudo с ним)
mjohnsonengr
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

Славомир Ленарт
источник