Bucle For y dormir en un script de bash

Tengo un script en bash con un bucle for, quiero dormir durante X segundos.

#!/bin/sh
for i in `seq 8`; 
    do ssh w$i 'uptime;
    ps -elf|grep httpd|wc -l;
    free -m;
    mpstat'; 
done &
pid=$!
kill -9 $pid

En Bash: sleep 2 duerme durante 2 segundos. Quiero matar el pid automáticamente después de 2 segundos.

  • Insertar sleep 2 antes de la kill línea.
  • eso no es lo que él quiere. Él quiere matar for si se toma demasiado tiempo, no espere 2 segundos después de exec luego matarlo
  • El OP dice que matar es si el bucle no tarda más de 2 segundos. sleep 2 iba a hacer eso precisamente. Si el proceso se ha completado, kill sería un no-op (las posibilidades de cualquier otro proceso de adquisición de la misma PID sería slim).
  • El done & línea tiene una & en que se divide el trabajo del bucle for como un proceso independiente. Ese proceso todavía se está ejecutando como las siguientes líneas ejecutar. Sin un sueño, el niño ejecuta el bucle for tendrían que ser sacrificados de inmediato.
  • También podría hacer un contenedor y hacer timeout 2 script
  • tienes razón, he leído &&, mi mal !
  • kill -9 es una exageración; sólo kill $pid debería ser suficiente.

InformationsquelleAutor Tomas | 2014-04-03

2 Kommentare

  1. 0

    Como se sugiere en los comentarios

    #!/bin/sh
    for i in `seq 8`; 
        do ssh w$i 'uptime;
        ps -elf|grep httpd|wc -l;
        free -m;
        mpstat'; 
    done &
    pid=$!
    sleep 2
    kill -9 $pid

    En esta versión, un proceso de ssh puede permanecer vivo para siempre. Así que tal vez sería mejor matar a cada comando ssh por separado:

    #!/bin/sh
    for i in `seq 8`; 
        do ssh w$i 'uptime;
        ps -elf|grep httpd|wc -l;
        free -m;
        mpstat' &;
        pid=$!
        sleep 0.3
        kill $pid
    done
  2. 2

    Que usted necesita para poner su bucle en un contenedor:

    Su guión (yo lo llamo foo.sh)

    #!/bin/sh
    for i in `seq 8`; 
        do ssh w$i 'uptime;
        ps -elf|grep httpd|wc -l;
        free -m;
        mpstat'; 
    done

    El contenedor

    #!/bin/sh
    foo.sh &
    pid=$!
    sleep 3         #sleep takes number of seconds
    kill $pid

    Usted también puede comprobar si el proceso ya existe por ps -p $pid -o pid | grep $pid

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea