EOF inesperado mientras busca un `'' coincidente

Tengo el siguiente script (networkingactado):

#!/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 

Cuando ejecuto este script obtengo este error:

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

¿Qué está mal?

No ha cerrado el command perl . Tiene que ser perl 'foo' y tienes perl 'foo lugar. Simplemente cambie su script a:

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

Eso se encargará del error de syntax. Sin embargo, su script aún no funcionará como esperaba. En primer lugar, cuando ejecuta ps | grep foo ps | grep foo , siempre obtendrás al less un resultado: el process grep mismo:

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

En segundo lugar, no le está diciendo a su script de perl que salga con un estado diferente dependiendo de si coincide. Por lo tanto, su condición if siempre será cierta ya que el script perl siempre se ejecutará, independientemente de si está haciendo algo útil.


Más al punto, estás reinventando la rueda. Si entiendo correctamente, quiere matar el process cata si ha estado funcionando durante más de una hora. Al less creo que eso es lo que esperas que haga tu script de Perl (no lo hace, pero no importa). Si es así, todo lo que necesitas es:

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

Eso podría necesitar alguna explicación. Al command ps se le puede indicar que liste solo PIDs específicos con la opción -p e imprima solo campos específicos de salida con -o . Aquí, le digo que imprima el PID y el time transcurrido en segundos. El command pgrep imprime cualquier PID que sea el patrón dado. Entonces, ps -p $(pgrep cata) ejecutará ps en cualquier PID cuyo process coincida con cata .

Como la bandera -o indica a ps que solo imprima el PID y el time transcurrido, el awk verificará si el time transcurrido (el segundo campo, $2 ) es mayor a una hora (3600 segundos) y, de ser así, imprimirá el primer campo, el PID. Entonces, el resultado del ps ... | awk ps ... | awk será la list de PID de los processs cata que se han estado ejecutando durante más de una hora. Esta list se entrega al command kill -9 .

Agregar un ' antes ; en realidad lo has olvidado:

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