'ps | grep | kill 'aborta meu script prematuramente [duplicado]

0

Eu tenho um computador Linux que remotamente o SSH usa plink em uma máquina Windows XP . Eu tenho um programa Plink configurado para executar comandos em um script usando login automatizado:

plink -ssh [domain name] -l [username] -pw [password] -m commands.txt >> Outputtext.txt

commands.txt contém apenas o seguinte

echo "Killing process"
ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1' | xargs kill -9
sleep 2
echo "Restarting process"
processd &

echo "Exiting..."

Esse script simplesmente procura por um processname que o mata e o reinicia. Ele funciona toda vez que o processo é iniciado no linux antes de eu executar o script. No entanto, se o processo NÃO for iniciado, ele realmente destruirá o terminal de controle e sairá do plink.exe no comando ps -ef .

Reduzi para quando eu estou fazendo o ps -ef | grep 'processname' ele retornará dois PIDs é o processo que estou procurando, e o outro é o próprio PID do processname grep

Quando o processo não é iniciado, ele retornará apenas um PID grep 'processname' e acho que kill -9 está eliminando isso e, de alguma forma, eliminando a conexão plink ou o terminal de controle? Existe alguma maneira de contornar isso?

ou para verificar se grep 'processname' retorna 2 linhas, o que significa que o processo foi iniciado ou, se houver apenas uma linha, não a mate.

Não tenho certeza se posso echo "#!bash" um script bash e depois executar o script bash?

Ou isso é um bug estranho no plink?

    
por zacharoni16 18.05.2013 / 03:37

2 respostas

1

Sua linha de comando parece muito estranha para mim:

ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1 | xargs kill -9
  1. Você alimenta awk (ou seja, um programa que pode filtrar perfeitamente sua entrada, o programa muito mais poderoso) com a saída de grep .
  2. Você canaliza a saída de awk (ou seja, um programa que pode filtrar perfeitamente sua saída) em head .
  3. Você usa xargs para definitivamente apenas um argumento.

Então, independentemente de melhores abordagens (e essa questão é uma duplicata), sinto-me obrigado a corrigir isso:

kill -9 $(ps -ef | awk '/processname/ {print $2;exit;}')
    
por 19.05.2013 / 02:18
0

Restringir ps para encontrar somente o comando e gerar as informações que você gosta.

ps -C processname -o pid

Você pode querer verificar o código de resultado do comando antes de tentar realmente matar qualquer coisa.

    
por 18.05.2013 / 03:50