2015-10-03 3 views
1

Я новичок в Linux, и я создаю программу, которая получает имя процесса, получает свой PID (у меня нет проблем с этой частью), а затем передаю PID команде kill, но она не работает. Это выглядит примерно так:Как убить процесс по его pid в linux

read -p "Process to kill: " proceso 
proid= pidof $proceso 
echo "$proid" 
kill $proid 

Может кто-нибудь сказать мне, почему он не убивает его? Я знаю, что есть другие способы сделать это, даже с PID, но никто из них, похоже, не работает для меня. Я считаю, что это какая-то проблема с языком Bash (который я только начал изучать).

ответ

3

Вместо этого:

proid= pidof $proceso 

Вы, вероятно, имел в виду это:

proid=$(pidof $proceso) 

Даже так, программа может не убить. По умолчанию kill PID посылает сигнал TERM указанному процессу, дает ему возможность отключиться в порядке, , например, очищает ресурсы, которые он использует. Самый сильный сигнал для отправки процесса без грациозной очистки - KILL, используя kill -KILL PID или kill -9 PID.


Я считаю, что это какая-то проблема с языком Баш (который я только начал обучение).

Оригинальные линии вы вывесили, proid= pidof $proceso должен вызвать ошибку, и Bash напечатает сообщение об ошибке о нем. Проблемы с отладкой начинаются с чтения и понимания сообщений об ошибках, которые программное обеспечение пытается вам рассказать.

+0

Спасибо большое, ребята! Я пробовал все ваши решения, но проблема была там, где вы указывали. Не знал, что мне нужно было положить все это выражение beetween() и с $ в начале. Я буду больше беспокоиться об этом сейчас, спасибо! –

0

Вы должны отправить флаг SIGKILL с заявлением об уничтожении. kill -9 [pid] Если вы не используете операционную систему, вы можете убить процесс в удобное для него время, SIGKILL (-9) сообщит os, чтобы убить процесс СЕЙЧАС, не игнорируя команду дольше.

0

Попробуйте убить -9 Это будет убить любой процесс с PID, приведенные в скобках

0

Try "убить -9 $ proid" или "убить -SIGKILL $ proid" команды. Если вы хотите получить дополнительную информацию, click.

+0

SIGKILL следует использовать только в качестве последнего средства: он предотвращает изящное закрытие процесса. Для получения дополнительной информации см. [Когда я не должен убивать -9 процесс?] (Http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) – John1024

+0

Спасибо для информации. Я этого не знал. –

2

kill ожидает, что вы скажете **, как убить *, поэтому должно быть 64 разных способа убить ваш процесс :) У них есть имена и номера. Самый смертельный - . Некоторые интересные из них включают в себя:

  • SIGKILL - The SIGKILL (также) сигнал заставляет процесс, чтобы остановить немедленно запустить. Программа не может игнорировать этот сигнал. Этот процесс также не подходит для очистки.
  • SIGHUP - Сигнал SIGHUP отключает процесс от родительского процесса. Это также можно использовать для перезапуска процессов. Например, «killall -SIGUP compiz» перезапустит Compiz. Это полезно для демонов с утечками памяти.
  • SIGINT - Этот сигнал аналогичен нажатию ctrl-c. В некоторых системах «delete» + «break» отправляет тот же сигнал процессу. Процесс прерывается и останавливается. Однако процесс может игнорировать этот сигнал.
  • SIGQUIT - Это похоже на SIGINT с возможностью сделать процесс выдачей дампа ядра.
0

Основываясь на том, что у вас есть, похоже, что вы не получаете фактический PID в своей переменной proid. Если вы хотите, чтобы захватить выход pidof, вам нужно будет приложить эту команду в backtics для старой формы command substitution ...

proid=`pidof $proceso` 

... или как и для новой формы подстановки команд.

proid=$(pidof $proceso) 
+0

Я понял, что после того, как вы, ребята, сказали мне, ха-ха, спасибо большое! –

0

У меня была аналогичная проблема, только для запуска монитора (видеонаблюдения) в течение нескольких часов в день. Написал два сценария sh;

кошка startmotion.sh

#!/bin/sh 
motion -c /home/username/.config/motion/motion.conf 

И второй; кошка killmotion.sh

#!/bin/sh 
OA=$(cat /var/run/motion/motion.pid) 
kill -9 $OA 

Они были вызваны из кронтаба в назначенное время

ctontab -e 
0 15 * * * /home/username/startmotion.sh 
0 17 * * * /home/username/killmotion.sh 

Очень просто, но это все, что мне нужно.

Смежные вопросы