EOF inesperado ao procurar por um '' 'correspondente

1

Eu tenho o seguinte script (redigido):

#!/bin/bash

set -x

if ps -lf | grep cata |  perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1); then
   ...    
else
   ...
fi
set +x

Ao executar este script, estou recebendo este erro:

/bin/kill.sh: line 8: unexpected EOF while looking for matching '''
/bin/kill.sh: line 20: syntax error: unexpected end of file

O que está errado?

    
por raj verma 18.10.2015 / 17:33

2 respostas

4

Você não fechou o comando perl . Ele precisa ser perl 'foo' e você tem perl 'foo . Basta alterar seu script para:

if ps -lf | grep cata |  
    perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then

Isso cuidará do erro de sintaxe. No entanto, seu script ainda não funcionará conforme o esperado. Primeiro de tudo, quando você executa ps | grep foo , você sempre obterá pelo menos um resultado: o próprio processo grep:

$  ps -lf | grep cata
0 S terdon    6400  4889  0  80   0 -  3183 -      19:03 pts/0    00:00:00 grep --color cata

Em segundo lugar, você não está dizendo ao script perl para sair com um status diferente, dependendo da correspondência. Portanto, sua condição if sempre será verdadeira, pois o script perl sempre será executado, independentemente de estar fazendo alguma coisa útil.

Mais ao ponto, você está reinventando a roda. Se bem entendi, você quer matar o processo cata se ele estiver sendo executado por mais de uma hora. Pelo menos eu acho que é o que você espera que seu script Perl faça (isso não acontece, mas não importa). Se sim, tudo que você precisa é:

kill -9 $(ps -o pid=,etimes= -p $(pgrep cata) | awk '$2>3600{print $1}')

Isso pode precisar de alguma explicação. O comando ps pode ser solicitado a listar apenas PIDs específicos com a opção -p e a imprimir apenas campos específicos de saída com o -o . Aqui, estou dizendo para imprimir o PID e o tempo decorrido em segundos. O comando pgrep imprime todos os PIDs que executam o padrão fornecido. Portanto, ps -p $(pgrep cata) executará ps em qualquer PID cujo processo corresponda a cata .

Como o sinalizador -o informa a ps para imprimir somente o PID e o tempo decorrido, o awk verificará se o tempo decorrido (o segundo campo, $2 ) é maior que uma hora (3600 segundos) e, em caso afirmativo, imprimirá o primeiro campo, o PID. Assim, o resultado do ps ... | awk será a lista de PIDs de cata processos que estão sendo executados há mais de uma hora. Essa lista é então dada ao comando kill -9 .

    
por 18.10.2015 / 18:18
3

Adicione um ' antes de ; que você realmente esqueceu:

if ps -lf | grep cata | perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then
    
por 18.10.2015 / 18:17