cómo detener el comando tail -f ejecutado en sub shell

Intenté varios pasos desde http://mywiki.wooledge.org/ProcessManagement y http://mywiki.wooledge.org/BashFAQ/068My pero no puedo lograr cómo eliminar el comando tail -f después de cierto intervalo de tiempo.

mi guion:

#!/bin/bash

function strt ()
{
command 1..
command 2..
}

export -f strt
su user -c 'set -e && RUN_Server.sh > server.log && tail -f server.log & pid=$! { sleep 20; kill $pid; } && strt'

exit 0.

Estoy tratando de eliminar el pid de tail -f server.log y continuar con 'strt', que es una función pequeña para averiguar si el servidor jboss está iniciado o no.

al ejecutar me sale error como

bash: -c: línea 0: error de sintaxis cerca del token inesperado `{' .

preguntado el 03 de mayo de 12 a las 12:05

¿Puedes ejecutar todo en el -c argumento sin el "su"? Parece que su subshell debería usar paréntesis en lugar de llaves, como ( sleep 20; kill $pid; ). -

NO amigo, probé con paréntesis. pero el mismo error. -

¿Por qué utilizar tail ¿en absoluto? parece que tendría más sentido simplemente RUN_Server.sh | tee server.log. -

Está bien. el tee server.log muestra el crecimiento del archivo que está siendo escrito por RUN_Server.log, pero ¿cómo elimino el pid? tal que con el código de salida 0, el script procede a ejecutar "strt".. -

¿Código de salida de la subcapa? ¿O el código de salida del script RUN_Server.sh? -

4 Respuestas

Prueba esta

timeout 20 tail -f server.log

Respondido 03 ago 12, 23:08

pid=$! { sleep 20 ; kill $pid; }

¿Que estás tratando de hacer? Tal vez solo agregue un punto y coma antes { ¿poder ayudar?

contestado el 03 de mayo de 12 a las 17:05

No amigo.. eso no funciona. TODOS estoy tratando de salir de la cola después de N segundos. porque tail -f server.log mostrará el crecimiento continuo de server.log. en la terminal... tengo que dar ctrl+c para matar a Shell. Estoy intentando eso en bash script. - Juanbritto

El problema que tienes es que tu sleeEl comando p no se ejecutará hasta después de que elimines tu tail.

La estructura de mando:

command1 && command2

dice que corra command1 y si sale con un código de salida de 0, entonces corre command2. Es equivalente a esto:

if command1
then
     command2
fi

Tuve una situación similar a esta hace un tiempo. Tuve que iniciar un servidor Weblogic, esperar hasta que se iniciara el servidor y luego hacer algo en el servidor.

Terminé usando tuberías con nombre (Direcciones) para hacer esto. Ejecuté el comando que inició el servidor Weblogic a través de esta canalización con nombre. Luego hice que otro proceso leyera la tubería, y cuando vi la cadena de inicio, salí de mi bucle y continué con mi programa.

El enlace de arriba debería darle instrucciones completas sobre cómo hacer precisamente eso.

contestado el 03 de mayo de 12 a las 20:05

Gracias a todos. Encontre un camino. aquí LOG=/var/log/tomcat/catalina.out sed '/^INFO: Inicio del servidor/q' <(tail -n 0 -f $LOG) . Esto encontrará una palabra en mi server.log y la matará. - Juanbritto

Estaba intentando algo similar, es decir, quería imprimir el pid de un proceso generado en segundo plano con ampersand (&), en una sola línea/una sola línea:

$ tail -f /var/log/syslog & ; echo $! 
bash: syntax error near unexpected token `;'

... pero seguía recibiendo el temido error de sintaxis, lo que me llevó a esta publicación.

Lo que no me di cuenta en mi ejemplo anterior, es que el & (y comercial) También es un separador/terminador de comando en bash - al igual que el ; (punto y coma) es!! Nota:

BashSheet - Greg's Wiki

  • [comando] ; [comando] [nueva línea]
    Los puntos y comas y las líneas nuevas separan los comandos sincrónicos entre sí.
  • [comando] y [comando]
    Un solo ampersand finaliza un comando asíncrono.

Entonces, dado que el &, que es un terminador de línea de comando en bash, en mi ejemplo anterior es seguido por un ;, cual es Además, un terminador de línea de comando - bash se ahoga La respuesta es simplemente eliminar el punto y coma. ;, y dejar solo el ampersand & actuar como un separador de línea de comando en el one-liner:

$ tail -f /var/log/syslog & echo $! 
[1] 15562
15562
$ May  1 05:39:16 mypc avahi-autoipd(eth0)[23315]: Got SIGTERM, quitting.
May  1 06:09:01 mypc CRON[2496]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
May  1 06:17:01 mypc CRON[5077]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May  1 06:25:01 mypc CRON[7587]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
^C
$ May  1 06:52:01 mypc CRON[15934]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ))
$ ps -p 15562
  PID TTY          TIME CMD
15562 pts/0    00:00:00 tail
$ kill 15562
$ ps -p 15562
  PID TTY          TIME CMD
[1]+  Terminated              tail -f /var/log/syslog
$ ps -p 15562
  PID TTY          TIME CMD
$ 

... sin embargo, en este ejemplo, debe eliminar manualmente el proceso generado.

Para volver al problema OP, puedo reconstruir el problema con esta línea de comando:

$ tail -f /var/log/syslog & pid=$! { sleep 2; kill $pid; } 
bash: syntax error near unexpected token `}'

Pensando en esto - bash ve & como separador, luego ve el comando "legal" pid=$!, y luego - con el comando "legal" anterior sin terminar, ve una llave { lo que significa un nuevo grupo de comandos en el shell actual. Así que la respuesta es simplemente terminar el pid=$! con un punto y coma ;, para que el nuevo grupo de comandos pueda iniciar correctamente:

$ tail -f /var/log/syslog & pid=$! ; { sleep 2; kill $pid; } 
[1] 20228
May  1 05:39:16 mypc avahi-autoipd(eth0)[23315]: Got SIGTERM, quitting.
May  1 06:09:01 mypc CRON[2496]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
May  1 06:17:01 mypc CRON[5077]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May  1 06:25:01 mypc CRON[7587]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
May  1 06:52:01 mypc CRON[15934]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ))
$ ps -p 20228
  PID TTY          TIME CMD
[1]+  Terminated              tail -f /var/log/syslog
$ 

Tenga en cuenta que tail -f proceso parece terminar la propiedad, pero en mi bash (versión 4.2.8(1)), tengo que presionar Enter en shell, para ver el "[1]+ Terminated ..." mensaje.

Espero que esto ayude,
¡Aclamaciones!

contestado el 01 de mayo de 13 a las 06:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.