2012-04-20 2 views
0

Как выполнить kill -9 в этом perl одном лайнере? Я получил вниз, туда, где у меня есть ИДП перечисленные и может распечатать его в файл, например так:perl - один лайнер, чтобы прорезать и убить pids

ps -ef | grep -v grep |grep /back/mysql | perl -lane '{print "kill -9 $F[1]"}' 
+2

Я узнал небольшой трюк, чтобы избавиться от лишнего grep, попробуйте 'grep/back/mysq [l]'. – gpojd

+0

Разве mysql не хранит ваш pid для вас? Почему вы пытаетесь сделать это таким образом? –

+1

Как правило, избегайте делать «убить -9» на все, что вам не нужно! Этот сигнал нельзя поймать и, следовательно, не дает процессу шанса (если это указано) для очистки временных файлов и разделов разделяемой памяти. Начните с 'kill -hup' и эскалации по мере необходимости. Чтобы найти базовое имя процесса, посмотрите на параметр '-o cmd'' ps' в качестве примечаний ikegami ниже.Более нечеткое совпадение со всей строкой 'ps' может быть опасно, если сделано небрежно, поскольку вы можете сопоставить неправильную вещь (вещи). – JRFerguson

ответ

3

OK, сильно отредактирован от моего первоначального ответа.

Во-первых, прямой ответ:

ps -ef | grep -v grep |grep /back/mysql | perl -lane 'kill 9, $F[1]' 

Done.

Но grep | grep | perl - это глупый способ сделать это. Моя первоначальная реакция: «Зачем вам нужен Perl?» Я обычно делаю это с awk | kill, сохраняя Perl для более сложных задач, которые оправдывают дополнительный ввод:

ps -ef | awk '/\/back\/mysql/ {print $2}' | xargs kill -9 

(Обратите внимание, что AWK не окажется, потому что строка «\/назад \/MySQL» Безразлично» т соответствует шаблону/\/назад \/MySQL /)

Вы можете, конечно, использовать Perl вместо AWK:

ps -ef | perl -lane 'print $F[1] if /\/back\/mysql/' | xargs kill -9 

(я намеренно использовал наклоняясь зубочистками вместо другого разделителя поэтому процесс Wouldn не найти себя, как в случае awk.)

Вопрос затем переключается с «Зачем вам нужен perl?». к "Зачем вам нужен Grep/AWK/убить?":

ps -ef | perl -lane 'kill 9, $F[1] if /\/back\/mysql/' 
+0

Вы правы, мне не нужен perl. Думаю, я попробую его с perl. Благодарю. – cjd143SD

+0

См. Мой отредактированный ответ; Я рассказал, как это сделать с Perl. Я просто пытался упростить. –

+0

Re "но я все равно не буду использовать его для фактического убийства:", почему бы и нет? – ikegami

1
ps -ef | grep -v grep |grep /back/mysql | perl -lane 'kill(9, $F[1])' 

kill функция доступна в Perl.

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

ps -ef | perl -lane 'kill(9, $F[1]) if m%/back/mysql\b%' 

(непроверенных)

+0

'$ _! ~ M% \ bgrep \ b%' ====> '! M% \ bgrep \ b%' – ikegami

+0

Обратите внимание, что как написано, этот perl также найдет себя. –

+1

@Mark; вероятно; вы можете «убить» (9, $ F [1]), если $ F [1]! = $$ && $ _ = ~ m%/back/mysql \ b% '. –

1

Почему вы не используете еще больше Perl?

ps -ef | perl -ane 'kill 9,$F[1] if m{/back/mysql}' 
+0

FWIW, я пришел к вашему образу мышления, @mob. Обратите внимание, однако, что ваше решение рискует самоубийством Perl. Вам нужно либо добавить что-то вместо grep -v grep, либо изменить регулярное выражение так, чтобы оно не соответствовало самому себе (именно поэтому я использовал наклонные зубочистки вместо m {...} в своем ответе). –

+0

@ Марк Рид - это хороший момент. Множество опций для избежания наклонных зубочисток: 'm {/ [b] ack/mysql}', 'm {/ b (a) ck/mysql}', 'm {/ back/mysql} x', ... – mob

+0

конечно, я просто застрял с наклоняющимися зубочистками, так как я менял пример awk и оставил их в покое, выполнил свою работу. Из командной строки я обычно использую трюк gpoj для прикрепления скобок вокруг одной буквы. –

3

Давайте использовать более подходящий ps команду, для начала.

ps -e -o pid,cmd --no-headers | 
    perl -lane'kill(KILL => $F[0]) if $F[1] eq "/back/mysql";' 
+0

Это похоже на много лишнего набора текста. :) –

+0

@Mark Reed, Тогда хорошая вещь, которую я набрал уже для OP, тогда ?? Я не уверен, что вы думаете. Это, очевидно, не одноразовый скрипт. – ikegami

+0

Я не уверен, что это очевидно; Я предположил, что это так, и ОП просто искал, как лучше всего сделать эту роль в будущем. Но это не было серьезным возражением (отсюда и смайлик). –

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