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

Обычно существует различие между корневым входом в систему и корневыми полномочиями.

В первом случае Вы идентифицируетесь системой как корень, подразумевая, что у Вас нет буквально ограничений, входа в систему, сделанного, поскольку корень обычно намного более опасен, чем наличие пользователя с корневыми полномочиями потому что:

  • пользователь не может быть ограничен группой или рядом предопределенных операций/программ
  • все системы безопасности в основном бесполезны, системные включенные журналы, так как пользователь root может просто удалить или иметь доступ ко всему
  • если Вы не можете отследить или доверять своим журналам, Вы, вероятно, не можете откатывать изменения или защитить данные эффективно

При наличии пользователя в ярости, это - вероятно, никогда хорошая идея, также даже, администратору действительно нужно неконтролируемое питание сделать его собственные вещи, поэтому много дистрибутивов отключают пользователя root прямо от /etc/shadow и используйте sudo это дает корневые полномочия, не входя в систему пользователя root, также sudo может различать несколько пользователей и ограничить их в четко определенном наборе полномочий и групп.

Существует интересное обсуждение здесь, также я предлагаю считать что-то о как shadow работы файла.

206
25.01.2017, 18:36
11 ответов

Существует много способов пойти об этом.

Метод № 1 - PS

Можно использовать 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

Можно возвратить фоновое задание переднему плану с помощью fg команда.

Пример

Поддельное задание, sleep.

$ sleep 100 &
[1] 4650

Получите число задания.

$ jobs
[1]+  Running                 sleep 100 &

Возвратите задание № 1 переднему плану и затем используйте Ctrl+C.

$ fg 1
sleep 100
^C
$
270
27.01.2020, 19:27
  • 1
    jobs имеет нет output и fg Саис: -bash: fg: 1: no such job. Но ввод fg работы хорошо и также pkill wget работы хорошо. но ps -eaf|grep wget и затем kill <process number> доза не останавливает задание. PS: Я использую третье число в качестве числа процесса. –  Mohammad Etemaddar 12.12.2013, 09:32
  • 2
    @MohammadEtemaddar - используют 2-е число от вывода ps. 3-й # является идентификатором процесса родителя. –  slm♦ 12.12.2013, 09:34
  • 3
    @MohammadEtemaddar - ах, PS находит grep. Сделайте это как это: ps -eaef| grep [w]get. –  slm♦ 12.12.2013, 09:54
  • 4
    @MohammadEtemaddar - можно также использовать pgrep вместо этого, pgrep wget. –  slm♦ 12.12.2013, 09:56
  • 5
    @MohammadEtemaddar - извините дополнительный e является опечаткой. Должен читать ps -eaf | grep [w]get. Опции, находятся в ps страница справочника. man ps. –  slm♦ 12.12.2013, 10:01

В ударе можно использовать fg получить задание к переднему плану и затем использовать Ctrl+C

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

kill %1

(с 1 замененным числом jobs дал Вам),

76
27.01.2020, 19:27

Править: Однажды на переднем плане, Вы можете 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.
6
27.01.2020, 19:27

Правильный способ - набрать 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
27.01.2020, 19:27

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

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

4
27.01.2020, 19:27

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

13
27.01.2020, 19:27

Un ejemplo común es la herramienta stress.Digamos que ejecutó lo siguiente:

$ stress -c 4 -m 4 

y cerró la ventana del terminal. El proceso continuaría consumiendo sus recursos desde el fondo.

De ella es lo que hago:

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

pgrepenumera los PID del proceso sujeto y lo almacena en la variable xque luego usa kill -9para terminarlo.

1
27.01.2020, 19:27

в bash последний остановленный процесс (Ctrl -Z )вы убьете:

kill %%
kill -9 %%

или, если хотите, используйте:

jobs

, затем:

kill %N

нравитсяkill %2

1
27.01.2020, 19:27

Самый простой способ — использовать флаг -9в команде kill

user@host:/path> jobs
[1]+  Running                 /usr/home/script1.sh $i &
user@host:/path> fg
/usr/home/script1.sh $i
^C
[1]+  Stopped                 /usr/home/script1.sh $i
user@host:/path> kill -9 %1
[1]+  Stopped                 /usr/home/script1.sh $i
user@host:/path>
[1]+  Killed                  /usr/home/script1.sh $i
user@host:/path>
user@host:/path> jobs
user@host:/path>
1
06.03.2020, 08:34

Это старый вопрос, и на него уже есть несколько хороших ответов, но я попытаюсь представить свой немного по-другому.

На самом деле фоновые процессы называются заданиями , и управление заданиями очень хорошо объясняется на этих 3 коротких страницах:https://www.gnu.org/software/bash/manual/html_node/Job-Control.html

По сути, мы можем ссылаться на задание по спецификации задания , то есть за символом %, за которым следует либо другой символ (, либо последовательность в некоторых более сложных случаях ), либо задание Я БЫ. И то же самое для kill, fg, bgили disown.

  • %+(или просто %, или%%)будет ссылаться на последний фоновый задание (текущее)
  • %-будет ссылаться на предыдущий
  • %{jobid}будет ссылаться на указанное задание

Чтобы вывести список фоновых заданий, используйте команду jobs.

Примечание

kill $!имеет другое поведение, он уничтожит последний процесс, отправленный в фоновом режиме как задание, а не последнее созданное задание.

например

Вы отправили 5 заданий в фоновом режиме.

Вы возвращаете задание #2 на передний план(fg %2или просто %2), затем отправляете его обратно на задний план (<Ctrl-Z>, затемbg).

Это последний процесс, отправленный в фоновый режим, но он остается заданием. #2.

Таким образом, kill $!завершит задание #2 -последнего процесса (re ), отправленного в фоновый режим, а kill %+завершит задание #5, последнее задание, которое создано ("текущая работа"):

$ 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 &
0
16.03.2021, 19:52

Список всех заданий, набрав

jobs

Вывод>>[1]+ Остановлен sudo nano ls.txt

Вывести этот процесс на передний план и убить

fg %1
then press ctrl+c
-1
19.03.2021, 05:36

Теги

Похожие вопросы