Подтвердить что ты не робот

Shell script, чтобы получить идентификатор процесса в Linux

Я хочу написать оболочку script (.sh file), чтобы получить данный идентификатор процесса. То, что я пытаюсь сделать здесь, - это когда я получаю идентификатор процесса, я хочу убить этот процесс. Я работаю на Ubuntu (Linux).

Я смог сделать это с помощью команды типа

ps -aux|grep ruby
kill -9 <pid>

но я не уверен, как это сделать через оболочку script.

4b9b3361

Ответ 1

Использование grep по результатам ps - плохая идея в script, так как некоторая часть времени также будет соответствовать процессу grep, который вы только что вызвали. Команда pgrep устраняет эту проблему, поэтому, если вам нужно знать идентификатор процесса, это лучший вариант. (Обратите внимание, что, конечно, может быть много совпадений процессов.)

Однако в вашем примере вы можете просто использовать аналогичную команду pkill, чтобы убить все соответствующие процессы:

pkill ruby

Кстати, вы должны знать, что использование -9 является чрезмерным (ho ho) почти в каждом случае - есть некоторые полезные советы об этом в тексте "Безболезненное использование буквы формы kill -9":

Нет, нет. Не используйте kill -9.

Это не дает этому процессу возможности:

  • отключить соединения сокетов
  • очистка временных файлов
  • сообщите своим детям, что он уходит.
  • reset его характеристики терминала

и т.д. и т.д. и т.д.

Как правило, отправьте 15 и подождите секунду или два, и если это не работа, отправьте 2, и если это не сработает, отправьте 1. Если этого не произойдет, УДАЛИТЕ БИНАРЫ, потому что программа плохо себя ведет!

Не используйте kill -9. Не выводите комбайн только для аккуратного вверх по цветочному горшку.

Ответ 2

Если вы собираетесь использовать ps и grep, тогда вы должны сделать это следующим образом:

ps aux|grep r[u]by

Эти квадратные скобки заставят grep пропускать строку для самой команды grep. Поэтому, чтобы использовать это в script do:

output=`ps aux|grep r\[u\]by`
set -- $output
pid=$2
kill $pid
sleep 2
kill -9 $pid >/dev/null 2>&1

Выходы позволяют вам выводить вывод комманда в переменную оболочки. set -- анализирует вывод ps в слова, а $2 - это второе слово на строке, которое является pid. Затем вы отправляете сигнал TERM, подождите пару секунд, пока рубин не выключится, а затем уничтожьте его безжалостно, если он все еще существует, но выбрасывайте любой результат, потому что большую часть времени kill -9 будет жаловаться на то, что процесс уже мертв.

Я знаю, что я использовал это без обратных косых черт перед квадратными скобками, но сейчас я проверил его на Ubuntu 12, и, похоже, он их требует. Вероятно, это связано с bash множеством опций и конфигурацией по умолчанию на разных дистрибутивах Linux. Надеемся, что [и] будут работать где угодно, но у меня больше нет доступа к серверам, где я знаю, что он работал без обратной косой черты, поэтому я не могу быть уверен.

Один комментарий предлагает grep-v, и это то, что я делал, но потом, когда я узнал о [] варианте, я решил, что лучше создать еще один процесс в конвейере.

Ответ 3

Для начала нет необходимости делать ps -aux | grep.... Команда pidof гораздо лучше использовать. И почти никогда не делайте kill -9 см. здесь

чтобы получить результат из команды в bash, используйте что-то вроде

pid=$(pidof ruby)

или используйте pkill напрямую.

Ответ 4

опция -v очень важна. Он может исключить само выражение grep

например.

ps -w | grep sshd | grep -v grep | awk '{print $1}' to get sshd id

Ответ 5

Это работает в Cygwin, но оно также должно быть эффективным в Linux.

ps -W | awk '/ruby/,NF=1' | xargs kill -f

или

ps -W | awk '$0~z,NF=1' z=ruby | xargs kill -f

Bash Pitfalls

Ответ 6

Вы можете использовать команду killall:

$ killall ruby

Ответ 7

Это довольно просто. Просто запустите любую программу следующим образом: - x = gedit и echo $! это даст вам PID этого процесса. то сделайте это kill -9 $x

Ответ 8

Чтобы убить процесс в оболочке

getprocess=`ps -ef|grep servername`
#echo $getprocess
set $getprocess 
pid=$2
#echo $pid
kill -9 $pid

Ответ 9

Если вы уже знаете процесс, это будет полезно:

PID=`ps -eaf | grep <process> | grep -v grep | awk '{print $2}'`
if [[ "" !=  "$PID" ]]; then
echo "killing $PID"
kill -9 $PID
fi