[bash script] if "existe tal proceso" ? [resuelto]

hola.

estoy mano a mano con un script y tengo un problema:

necesito usar la condicion de "si X programa esta en ejecucion..."

he buscado y todo lo que encuentro es un poco bastante lioso, con greps, cats y movidas que me descolocan por aqui y por allá.

si no hay forma "sencilla", pues me rompere los cuernos para comprender lo que encuentre por internet, pero si me podeis echar una mano como sea, pues os lo agradeceré :)


tengo un par de dudillas mas relacionadas:

en un then o en un else, puedo lanzar dos comandos? por ejemplo:

if tal
then comando1 && comando2
fi

y la ultima, en caso de que lo anterior sea posible:

a ver si me explico: esto se puede hacer?

if condicion
then comando1 && comando2 && volver a comprobar la condicion



espero haberme explicado bien :)

gracias
jorchube escribió:necesito usar la condicion de "si X programa esta en ejecucion..."
Puedes usar el comando "pidof " para obtener el pid de un proceso en ejecución.
jorchube escribió:esto se puede hacer?

if condicion
then comando1 && comando2 && volver a comprobar la condicion
Es lo que se conoce en programación como bucle while, verás como encuentras cosas por ahí.
if [ condición ]; then
comando1
comando2
cat lalala | grep caracoles > lolailo
loquesea
fi

Eso puede hacerse, no hace falta que sea todo juntito.

Lo de que vuelva a comprobar la condición, no lo entiendo. ¿Quieres que si se sigue cumpliendo la condición, repita? Si es eso, lo que buscas es while, si no, no le veo sentido.
while [ condición ]; do
tus comanditos
y más comandos
done

Se repetirá hasta que deje de cumplirse la condición.

Lo de si un programa está en ejecución, seguramente haya maneras muy sencillas, pero no las sé, así que mi método cutre en su día era con pidof . pidof te devolverá el pid del programa si está en ejecución, o nada si no lo está, y con eso ya puedes jugar.
que sepais que os quiero muchiiisimo :)

#!/bin/bash
A=$(pidof proceso)
while [ ! $A ]
   do
      mis comanditos
      A=$(pidof proceso)
done


it works fine!
jorchube escribió:que sepais que os quiero muchiiisimo :)

#!/bin/bash
A=$(pidof proceso)
while [ ! $A ]
   do
      mis comanditos
      A=$(pidof proceso)
done


it works fine!

Más sencillo:
#!/bin/bash
while [ ! $(pidof proceso) ]; do
   comanditos
done

Cada vez que se evalúa la condición se saca el pid del proceso, de modo que puedes cerrar y abrir el proceso de nuevo tranquilamente dentro del bucle que cogerá el pid nuevo.
muy cierto.

muchas gracias de nuevo ;)
Miedo me da este script.

Que intentas hacer?
#!/bin/bash
while [ ! $(pidof xfwm4) ]
   do
      killall metacity && xfwm4 --replace
      sleep 1
done


no es para tenerle miedo... simplemente como se comenta por los mil howtos de internet para usar xfwm en gnome nunca me arrancaba el xfwm de inicio, asi que se me ocurrio probar esto....

(es curioso, en debian si que iba segun los howtos.. en arch no)



se me ocurren cosas mas traviesas con este simple script... pero soy pacifico xD
Buffff y no puedes poner eso en los autolaunchs de gnome?

Porque menuda burrada, hacer un pidof todo el rato.

Aunque sea metelo en un cron que ejecutes cada 10 segundos o algo asi y cambias el while por un if.
Ferdy escribió:wait ?

- ferdy


Pues si, bastante mejor que andar todo el tiempo ejecutando el bucle


#!/bin/bash

while [ 1 ]
do
killall metacity && xfwm4 --replace
wait `pidof xfmw4`
done
por partes xD

killall metacity && xfwm4 --replace en autolaunch no funciona, por eso pense en algo como este script, que si que tengo en autolauch al iniciar sesion.

por otro lado, tambien me di cuenta de que el script permanecia ejecutandose toda la sesion, no le di mucha importancia, la ram era insignificante, pero tenia en mente investigar algo que lo parase.

#!/bin/bash
while [ ! $(pidof xfwm4) ]
   do
      killall metacity && xfwm4 --replace
      wait `pidof xfwm4`
done


vale, wait espera a que termine el comando especificado (si se especifica) que haya sido ejecutado en la misma shell, es una mejora al script, en lugar de estar todo el rato pidiendo el pidof del proceso.

sin embargo, en este caso, el wait `pidof xfwm4` termina en el momento se recibe el pid, no cuando este deja de existir, no?
si funciona asi, no acabo de comprender, puesto que el bucle sigue ahi....



por otra parte, os agradezco mucho que me ayudeis y me ilustreis ;)
Ambos dos: FAIL! Lo más cómodo es usar wait con la variable $!

- ferdy
la sintaxis seria esta?

wait $! `pidof xfwm4`

imagino, que de esta forma lo que ocurre es que el wait espera hasta que no exista un pid para ese proceso, momento en el cual permitira que s esiga con el bucle. cierto?


repito: muchisimas gracias :)


pd: cuando teminemos definitivamente con este script me parece que editare el titulo, tengo otra duda preparada para otro script, si no la soluciono yo antes xD
Lo suyo sería que miraras la documentación. La idea de usar $! es no usar pidof.

- ferdy
jorchube escribió:la sintaxis seria esta?

wait $! `pidof xfwm4`

imagino, que de esta forma lo que ocurre es que el wait espera hasta que no exista un pid para ese proceso, momento en el cual permitira que s esiga con el bucle. cierto?


repito: muchisimas gracias :)


pd: cuando teminemos definitivamente con este script me parece que editare el titulo, tengo otra duda preparada para otro script, si no la soluciono yo antes xD



Para que usas el $! y el pidof?

Ferdy, tu solucion es sin duda mejor [oki]

Sin embargo esta bien saber lo del pidof en caso de que queramos meter una orden entre los dos comandos (un sleep por ejemplo) ya que $! nos manda el PID del ultimo proceso lanzado.
Siempre se puede guardar el $! en una variable, asi no lo perderemos.
El único problema que tienes con pidof es que no suele estar en el PATH de un usuario normal. Y que puede no estar en otros sistemas operativos.

De todos modos es bastante cómodo, yo lo uso muchísimo en el día a día.

- ferdy
#!/bin/bash
while [ $! xfwm4 ]
   do
      killall metacity && xfwm4 --replace
      wait $! xfwm4
done

espero haber acertado esta vez... me pierdo con el $!, que a parte de lo que ha dicho Txukie, no he encontrado nada (supongo que el problema es mas bien que deberia familiarizarme mas con este lenguaje para comprender mejor las cosas ... pero bueno, en ello estoy xD)


buscando sobre wait, si que encontre waitpid, que sustituiria a wait `pidof tal`

sobre pidof, si que lo tengo en el path de mi usuario desde un principio.
$! es una variable que contiene el PID del ultimo proceso lanzado

Luego con poner wait $! ya valdria
#!/bin/bash
while [ ! $(pidof xfwm4) ]
   do
      killall metacity && xfwm4 --replace
      wait $!
done


entonces asi es como debe ser. xD


muchas gracias a los dos.
19 respuestas