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 }')
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}'
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.
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.
Tags cron openwrt shell-script