Saída de tubulação do awk para matar -9

4

Estou tentando matar qualquer processo que tenha a ver com o mysql. Estou montando um comando e até agora não encontrei a solução certa. Uma outra consideração, é que o último processo corresponderá ao comando 'grep mysql' - parte do comando abaixo. Esse processo não existirá mais quando eu tentar matá-lo, então ele precisa ser excluído da entrada canalizada para matar -9. Qual é a melhor maneira de realizar essa tarefa? Até agora, eu tenho o comando incompleto:

ps -A | grep mysql | awk '{print $1}'

que tem a saída (falsa, para o propósito deste exemplo)

11111
22222
33333  # process id to be excluded

Eu estava supondo que eu poderia canalizar isso para xargs matar -9 da seguinte forma:

ps -A | grep mysql | awk '{print $1}' | xargs kill -9

e descubra uma maneira de excluir o último pid, mas tudo que eu tento parece não funcionar corretamente.

    
por Charlotte 15.03.2012 / 18:13

6 respostas

13

Provavelmente, a melhor coisa a fazer aqui é fazer grep não corresponder ao seu próprio comando:

ps -A | grep [m]ysql | awk '{print $1}' | xargs kill -9

Os colchetes ao redor do m fazem dele um conjunto de caracteres que inclui apenas m, o que não altera o padrão, mas não combina com a saída ps . Essa é uma maneira canônica de evitar esse problema. Eu também gostaria de acrescentar que, se você tiver o comando pkill , executar pkill -9 mysql é um pouco mais fácil.

Também é importante notar que você deve evitar usar o SIGKILL (-9) quando possível, pois isso não dá ao processo de destino uma chance de sair normalmente. Provavelmente você deve tentar primeiro com SIGTERM (padrão) se ainda não o fez.

    
por 15.03.2012 / 18:23
6

Awk tem um comando system () que permite que você o mate diretamente ... Algo parecido com isto.

ps ¦awk '/[m]ysql/{system( "kill -9 "$1)}'

O motivo dos colchetes é semelhante ao anterior. Isso evita que o awk seja morto e feche o cano.

O / string / executará uma correspondência de linha semelhante ao grep.

    
por 16.03.2012 / 01:59
3

Para completar, eu também sugiro os comandos pgrep e pkill .

  • pgrep [-lf] [-u uid] [-other options] pattern lista processos que correspondem ao padrão de expressão regular estendida
  • pkill [-f] [-t**SIGNAL] pattern kill processa o padrão de correspondência

As opções mais interessantes, como indicado, são provavelmente

  • -f corresponde à linha de comando completa de um processo
  • -u user corresponde apenas a processos de usuários específicos (também, grupos ...)
  • -l listar o nome / identificador do processo (somente pgrep)

Para os outros, veja o bom manual.

Em suma, eles são muito mais versáteis e úteis (em termos de poder realmente checar o que você mata antes de você) do que killall ou as receitas de cachimbo mais complicadas postadas acima.

    
por 16.03.2012 / 11:55
1

Para remover o último da lista de PIDs, você pode usar head -n N , onde n é o número de PIDs sem o último.

ps -A | grep mysql | awk '{print $1}' | head -n 2 | xargs kill -9

A suposição é que você sabe o número de PID que será canalizado do grep.

    
por 08.03.2013 / 01:35
0

Ou o

killall mysql 
O comando

pode fazer isso por você. Usa nomes em vez de PIDs.

    
por 15.03.2012 / 20:00
-2
kill -9 'ps aux | grep PROCESS_NAME | grep -v grep  |  cut -d' ' -f6'
    
por 25.11.2013 / 14:35