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 .