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
.