Como matar um processo no shell script que está sendo executado através do cron?

4

Eu tenho um script de shell que é executado no cronjob. Este script de shell tem que matar um processo que está sendo executado e iniciar o novo processo novamente.

Quando executo o script manualmente, ele funciona perfeitamente, mas quando executado pelo cron ele não mata o processo antigo, mas inicia um novo processo junto com o antigo.

Estou usando a linha de código abaixo para eliminar o processo:

mate -9 ps | grep "server1" | grep -v grep | awk '{print $ 1}'

    
por user3887720 29.07.2014 / 15:06

3 respostas

3

Você precisa indicar o que matar:

kill -9 $(ps | grep "server1" | grep -v grep | awk '{ print $1 }')

Você também pode usar o truque:

kill -9 $(ps | grep "server[1]" | awk '{ print $1 }')
    
por 29.07.2014 / 15:08
3

No formulário mais puro , você pode usar

pkill server1

Isso pressupõe que server1 seja realmente o nome do processo, não apenas em algum lugar na linha de comando - caso contrário, adicione um -f .

pkill -f server1CommandArgument


Mas espere!

Você pode testar o que pkill irá corresponder e matar com o comando pgrep - que é tecnicamente quase o mesmo. A diferença: em vez de matar, imprime o PID .

Experimente: liste os PIDs correspondentes:

pgrep server1

-l também lista o nome do processo , não apenas o PID:

pgrep -l server1

-f corresponde à linha de comando , não apenas ao nome:

pgrep -fl server1

Quando você quer matar os processos correspondidos por pgrep , deixe de fora o -l e adicione um sinal, se você quiser algo diferente do padrão SIGTERM, -15 :

pkill -9 server1

Como seu exemplo usa um comando ps simples, que corresponde apenas aos processos no terminal atual por padrão, tome cuidado com o que é correspondido por seu comando, pois pgrep e pkill não estão correspondendo apenas aos processos atuais terminal.

Uma nota secundária sobre o uso de kill -9 - é a maneira mais violenta de matar ; tem a certeza de que é realmente necessário ?

Isso pode não importar, dependendo do tipo de programa morto. Mas você não deve fazê-lo sem um bom motivo para um programa / servidor que pode salvar os dados de arquivos, escreve arquivos de bloqueio, etc. Contanto que um programm não travar mal, um kill usando o sinal padrão -15 faria.

    
por 29.07.2014 / 16:32
0

Dentro do shell script, você deve pular sh também. Abaixo o comando funcionou para mim.

ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}'

Script:

#!/bin/bash
var='ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}''
if [ !-z "$var"]
then
  echo $1 process is not running 
else
  kill -9 $var
  echo $1 process killed forcefully, process id $var.
fi

Referência: O processo de linux Force Kill no script de shell pode passar pelo artigo para uma explicação completa.

    
por 27.09.2016 / 16:42