¿Como ejecutar un comando luego de haber terminado otro? (Cerrado)

El problema es q suelo estar actualizando MDV o estoy bajando algo y el sueño de repente me pilla y quiero hacer q cuando se termine de ejecutar el comando en curso como p.e. urpmi, se ejecute el comando halt, pero no se como hacerlo, y me imagino q puedo utilizar el Nº proceso pero ¿COMO?.

Otra cosa es q suelo ejecutar la sgte línea:

urpmi.update -a; urpmi --force --auto-select

por lo que si de Nº de procesos se trata acá estoy frito ya q me imagino q mientras no termine urpmi.update -a y se ejecute urpmi --force --auto-select el nº de proceso no me sirve.

¿Alguna solución? o estoy peinando la muñeca con esta idea XDDDD

Salu2!!!

Opciones de visualización de comentarios

Seleccione la forma que desee de mostrar los comentarios y haga clic en «Guardar opciones» para activar los cambios.

RE: como ejecutar un comando luego de terminado otro

Saludos,

puedes "planear" el momento en que se apaga el ordenador con el comando shutdown: #shutdown -h n, donde n es el número de minutos que quieres que el ordenador espere.

Si quieres que de verdad dependa del final de un proceso, utiliza los signos &&, ||:

urpmi && halt hará que el ordenador se detenga si el proceso urpmi termina con éxito

urpmi || halt hará que el ordenador se detenga si urpmi no termina con éxito

De todas formas, seguro que todo esto y más aparece en man bash...

Suerte,

Daniel.

status de salida

el arte del bash scripting, nos enseña que, cualquier comando ejecutado lleva un estado de salida, que puede ser exito o fracaso, y se corresponde con los valores 0 para exito y entre 1 y 255 para fracaso, este valor se almacena en la variable $?.
Como te comento Baciyelmo, el doble ampersand && o el dobrle pipe || indican que si un comando que se ejecuta tiene exito ( && ) se ejecute el siguiente o al contrario, si tiene fracaso ( || ) que se ejecute el siguiente.
Si esto lo combinas con un if then else, seras el dueño del mundo.
para el comando shutdown simplemente ponle la hora de apagado, tal como

shutdown -h 05:00 ---> apagara el sistema a las 5 de la mañana.
shutdonw -h now ---> lo ejecutara en el momendo de lanzarlo.

Linux user: #378807

Un metodo

* instalas el programa screen
* Inicias una terminal de texto (konsole, xterm...)
* ejecuto el programa screen
* alli, te pasas a root con

su - 



* tecleas lo siguiente (todo en una linea):

urpmi.update updates plf-free plf-non-free && 
urpmi --wget --auto --auto-select  --test && 
urpmi --wget --auto --auto-select && 
shutdown -h now




* despegas la sesion de screen con Ctrl+A Ctrl+D

* te vas a dormir

Salut,
Sinner

:O

Mr. Sinner, gracias por responder y te comento que conozco la función del ";" y/o los "&&", pero a lo que voy es que se supone me olvidé y/o no tenía planeado bajar el equipo, pero a veces el "urpmi.update -a" se pone muy lento y llegado el sueño quiero dejar ordenado que se apague terminada la actualización, y no puedo utilizar shutdown porque no se cuanto se va a demorar todo el proceso, y para darle un exceso de tiempo mejor me dejo de mosquear y se queda encendido jajajaja.

Salu2!!!

Pues...

Pues ya te dieron una catedra de sobre las salidas pero si quieres ejecutar un comando independiente si sale bien o mal solo usas ; (punto y coma) asi:

clear; echo "Hola Mundo... ¿Dejavu?"; sleep 10; clear

No importando si sale bien o mal ejecutara el siguiente comando :-)

--
¿Quien es Jesucristo?
dalfa@jabber.org

mmmm........

Creo q no me explique muy bien jejeje, sorry, trataré de hacerlo mejor ahora, y esta es la situación:

Estoy trabajando en mi PC, pero no estoy utilizando inet por lo q decido aplicar una actualización vía la sgte. línea de comando:

urpmi.update -a; urpmi --force --auto-select

De repente me llaman por teléfono q me pasarán a buscar por X motivo, OK, termino lo q estoy haciendo, cierro todas las aplicaciones y OH!!! veo que se está ejecutando el proceso de actualización y me da lata cancelar dicho proceso, ¿Que hago? aplicar un Ctrl+C cara dura no es precisamente mi idea mientrazzzzzz no descarte si tengo más opciones, ¿Cuales? jajajaj no tengo idea...

En un principio la creí fácil y pense aplicar el comando:

ps ax | grep urpmi

y con esto tomar el Nº de proceso y según su estado hacer un script q al finalizar dicho proceso se ejecutara el comando halt ('uta q se pueden hacer cosas con el teclado, tanto comop con la boca) pero el comando "ps ax" solo me muestra lo que está en ejecución y no lo q deberá ejecutarse a continuación, esto gracias al dichozo ";"...

...entonces, pregunto algunos disparates:

¿existe la forma de encolarle otro comando a la ĺinea "urpmi.update -a; urpmi --force --auto-select" despues q ya se a ingresado la orden?

Shutdown a pelo no me sirve porq no tengo la menor idea a q hora terminará de ejecutarse el urpmi --auto-select.

En fin, me imagino q + de alguien se preguntara pa'q tanta problematica, pues bien, es solo una forma de ir aprendiendo cosillas + avanzadas, pero estoy claro q muchas ideas pueden ser totalmente inviables, ¿Será este el caso?

Salu2!!!

screen

La solucion, es usar el screen, que esta para justo lo que pides.

El programa "screen" es una terminal "despegable".

Ejemplo: Conectas el ordenador, empiezas a recompilar los src.rpm de KDE-4.0.0-alpha-1 ... peeeeeeeeero tienes que irte al colmado a comprar mas galletitas saladas. Como sabes que si te vas va a entrar tu hermano/hermana/novia/madre/padre/el butanero a revisar su correo jotmeil o a chatear con el mesencher, es imprescindible que abandones la sesion grafica.

Para ello:

1. lanzas xterm / konsole...
2. ejecutas "screen" y te proporcionara una "terminal despegable"
3. en la sesion de screen, ejecutas rpmbuild --rebuild kde-4.0.0-0.0.1.src.rpm
4. "Despegas" la sesion de screen con "CtrlA Ctrl D"
5. cierras la sesion grafica. la session de screen seguira ejecutandose
6. te vas al colmado
7. cuando vuelves, sacasa escobazos de delante de tu ordenador a tu hermano/hermana/novia/madre/padre/el butanero
8. te loginas graficamente
9. lanzas xterm / konsole...
10. "pegas" la sesion de screen con screen -rd
11. Observas que rpmbuild sigue compilando tan limpiamente

?A que mola?

Salut,
Sinner

¿sería algo parecido a

¿sería algo parecido a lanzar un comando usando "nohup"?

nohup urpmi pepe &

Saludos

Seamonkey1.0b (Mozilla1.8)

mas o menos

mas o menos,

Pero no vas a poder retomar esa "linea de pensamiento", perdiendote los errores que puedan producirse y todo eso.

Por eso, "screen" es superior a nohup.

Salut,
Sinner

Bastaría con leer el

Bastaría con leer el fichero nohup.out que se crea al correr nohup :-)

Saludos

Seamonkey1.0(Mozilla1.8)

solución elegante

El bash es una maravilla. A ver si es esto lo que necesitas:

[daniel@localhost ~]$ urpmq cd 

...empieza a trabajar. Pulsas [Ctrl+z]. El proceso se detiene y te dice el número del proceso dentro de la terminal en la que estás trabajando:

[1]+  Stopped                 urpmq cd 

En este caso, urpmq tiene el número uno. Comprobemos el estado del proceso:

$ ps T
  PID TTY      STAT   TIME COMMAND
 6730 pts/0    Ss     0:00 bash
 7529 pts/0    T      0:01 /usr/bin/perl /usr/bin/urpmq cd
 7530 pts/0    R+     0:00 ps T 

La T significa que, efectivamente, el proceso está detenido. La terminal está libre para que hagas con ella lo que quieras.
Ahora tecleas el comando fg para que se vuelva a poner en marcha el proceso detenido:

$ fg
urpmq cd
ningún paquete llamado cd
Los siguientes paquetes contienen cd:
backuponcd
ccd2iso
...

Resumo:
1. Lanzas el proceso "largo"
2. Lo detienes con [Ctrl+z]
3. Lo "recuperas" con fg.

Por supuesto, el inconveniente es que si cierras la terminal se va todo al garete. Por eso es mejor hacer estas cosas en una consola. A ver si te sirve.

Saludos,

Daniel

Si, pero...

pero....

Yo no quiero ejecutar el siguiente comando si algo ha salido mal.

Si el update o el test de la isntalacion no han funcionado, me niego a intentar actualizar. Y, si la actualizacion falla, quiero verlo por la manyana, es decir, encontrarme con el PC encendido.

Asi, saber que tengo que arreglar algo.

Te da cuennnn?

El doble ampersand (el escriforcio este sin la comillas "&&") indica que el siguiente comando solo se ejecutara si y solo si el anterior ha finalizado con exito.

Y eso es lo que rpetendo.

Salut,
Sinner

Rizando el rizo

¿Y si lo que queremos es lanzar un proceso a través de una conexión telnet y que el ordenador siga trabajando sin necesidad de mantener abierta la conexión telnet?

Se podría usar screen o se muere el proceso una vez que haces logout de la conexión telnet???

Un saludo

JID: dinario(arroba).jabber.org

No sé con screen

Pero puedes probar con nohup:

nohup comando &

Saludos

Seamonkey1.0b (Mozilla1.8)

screen

Claro que se podria usar screen

Es mas, en conexiones remotas, se recomienda usar screen, por si se pierde la conexion, que no se pierda "la sesion"

Asi, si te conectas remotamente (por ssh; nunca por telnet!) y se cuelga la linea, sin screen pierdes la sesion. Si usabas screen, vuelves a conectarte , recuperas la sesion anterior via screen -rd y continuas con tu trabajo.

Salut,
Sinner

Solución por pooling

Vamos a hacer un script que compruebe cada 10 segundos si hay algún comando urpmi ejecutandose y si no es así, apagar el equipo:


#!/bin/bash
# Esto es GPL versión 2.0 porque me da la gana.
while true
do
if [ -z $(ps x|grep urpmi|grep -v grep|cut -f2 -d \ ) ]
then
shutdown -h now
fi
done

Como se puede ver, mientras exista algún comando con el texto urpmi ejecutandose que no sea un grep, no hace nada, mientras que si no hay ninguno, el resultado del cut será una cadena vacía, con lo que se ejecutará el shutdown. Evidentemente debe ejecutarse como root, y los urpmi por supuesto también deben ejecutarse como root ;)

-------------------------

Sin Dioses: ateísmo, escepticismo y racionalismo.
La Biblia: el gran engaño, fraude y mentira de Occidente.

No me funca el script...

al ejecutarlo sin existir un urpmi en ejecución me da este error:

[root@PC-Gualas guala]# ./urpmi-halt
./urpmi-halt: line 5: [: 8386: binary operator expected
./urpmi-halt: line 5: [: 8386: binary operator expected
./urpmi-halt: line 5: [: too many arguments
./urpmi-halt: line 5: [: 8386: binary operator expected
./urpmi-halt: line 5: [: too many arguments
./urpmi-halt: line 5: [: 8386: binary operator expected
./urpmi-halt: line 5: [: 8386: binary operator expected
./urpmi-halt: line 5: [: 8386: binary operator expected
./urpmi-halt: line 5: [: too many arguments
.
.
.

Y si existe un urpmi en ejecución me da esto:

[root@PC-Gualas guala]# ./urpmi-halt
./urpmi-halt: line 5: [: too many arguments
./urpmi-halt: line 5: [: too many arguments
./urpmi-halt: line 5: [: too many arguments
./urpmi-halt: line 5: [: too many arguments
./urpmi-halt: line 5: [: too many arguments
./urpmi-halt: line 5: [: too many arguments
.
.
.

de lo q hay en esta línea "if [ -z $(ps x|grep urpmi|grep -v grep|cut -f2 -d \ ) ]" tengo claro todo menos el if con ese -z ??? busq en google por si encontraba info y nada, entonces la consulta sería ¿Como throlles busco info detallada de bash? porq en los manuales y tutoriales q encontré todos hablan del control de flujo y bla-bla-bla pero ninguna tocaba el tema de en detalle como sería las opciones del if q uno puedo utilizar entre los corchetes [], y eso q estaba en spanish, pero en ninguna se picaba finito con lo q me interesa a mi en este momento, q es todo lo q queda dentro de los [] del if.

Otra cosa, editando en vi el script q posteaste me llamó la atención q por colores deduzzzzzco q vi me está indicando/guiando sobre los errores, el cuento es q en la linea 5 aparecen unos comandos de color violeta y al separar el "(" del "$" como q se mejora la cosa en cuanto a colores, pero ahí me arroja el sgte error:

[root@PC-Gualas guala]# ./urpmi-halt
./urpmi-halt: line 5: syntax error near unexpected token `('
./urpmi-halt: line 5: `if [-z $ (ps x|grep urpmi|grep -v grep|cut -f2 -d \ )]'

...primer set script 6 - guala 0 :((((((

Por cierto, agradecería muchísimo si te explayaras un poco sobre lo q hace "cut -f2 -d \", en todo caso yo ya mañana buscaré info con el man y/o google pero si te adelantas no me quejaría jejejeje.

Gracias, salu2!!!

man test

Te comento a grandes rasgos y deprisa que me largo a comer.
[] --> esto se corresponde con el comando test de linux.
Si haces man test veras que el flag -z se corresponde a cadena vacia.
Asi que lo que hace el if [ -z es verificar que lo que se ejecuta entre $() da una cadena vacia o no.
man test && man cut
Linux user: #378807

:O

Dicho en buen Chileno, ME Kgaste jajajajaja

man TEST... y q tiene q ver ese "test" con el if :S agradecería q alguien me recomendase algún texto q me hacerq a ese tema, ya q de todo lo q me leí sobre if nunca apareció nada de test y otras yerbas, por lo q está claro q hay algo q desconozzzzzco referente a bash, aparte de no conocer casi nada jejejejeje, pero cunado uno intenta estudiar este tema de forma autónoma se topa con estas cosas como los corchetes [] y no qda otra q tipear en google "if [-z" a ver si se encuentra algo de info, y al final no aparece nada de q cresta va entro de los [] y uno se queda con un tremendo agujero en lo q a conocimientos se refeire.

¿Alguien se imagina a un win2ero pregutando algo así? jajajaja y despues uno se pregunta porq hay gente q sigue con ese otro SO.

Salu2 y gracias por sus respuestas.

Tiene que ver todo

if then else o traducido al roman paladino, si esta condicion se da hacer esto y si no se da hacer lo otro.
if [ -z $(ps x|grep urpmi|grep -v grep|cut -f2 -d \ ) ] ---> esto viene a decir.- Si la ejecucion del comando que esta dentro de los parentesis da un valor vacion usease que no produce ninguna salida, o cadena vacia, circunstancia que verifica test o [ con el flag -z, entonces ejecuta lo que esta despues de then y si da una cadena no vacia ejecuta lo que sigue a else y luego termina con fi.
Queda claro?

Linux user: #378807

OK

Queda clarísimo!!!

El problema es q yo no pude llegar a obtener es info y eso es lo q me interesa saber porque, ya que yo como usuario NO informático de profesión ya conozco todos los comandos que aparecen entre corchetes así es que cuando ví el script entendi que la condición "if" (perdón si no se llama así) estaba relacionada con el resultado de la línea de comandos:

"ps x|grep urpmi|grep -v grep|cut -f2 -d \ "

la cual comprendí completamente luego de peliarme con los man correspondientes y hasta ahí todo bien, ya comprendía claramente que hacía lo que estaba dentro de los parentesis, pero no encontré la info adecuada que me guiara al dichozo test o como aprendí ahora, al flag -z del if jejeje, entonces la consulta puntual sería ¿donde busco esa info?... existe alguna que me muestre todos los flags q puedo utilizar o tengo q leerme algún manual avanzado de bash. ¿?

Salu2 y gracias por la pazzzz-ciencia.

Revisa

Revisa los paréntesis, los punto y comas (me parece que antes de "then"), .etc, todo lo que abres debe cerrarse después.

Saludos

Seamonkey1.0-es-ES

Alternativa

Image Hosted by ImageShack.us

Yo no pude hacer trabajar el script tal cual así que hice esta modificación:

#!/bin/bash
# Versión Original Ed Hunter
# Modificado por katnatek
# Esto es GPL versión 2.0 porque me da la gana.
while true
do
temp= ps x|grep urpmi|grep -v grep|cut -f2 -d '\'|wc -l
if [ $temp < 1 ]
then
shutdown -h now
fi
done

LA' YUME' NUM T'OX MUK'IL IN TIAL

:O

Tampoco funciona jajajajaja ¿a ti te funcionó? aunq lo veo difícil

./urpmi-halt2: line 8: 1: No existe el fichero o el directorio

ya son 2 los q no funciona, yame daré el tiempo pa ver si me la puedo pa' echar a andar alguno XDDDD

Salu2!!!

Correcciones

Image Hosted by ImageShack.us

Despues de recordar algunas cosas sobre programar scripts y de batallar un rato aquí esta una versión que deberia funcionar:

#!/bin/bash
# Versión Original Ed Hunter
# Modificado por katnatek
# Esto es GPL versión 2.0 porque me da la gana.
while true
do
temp=`ps x|grep urpmi|grep -v halt|grep -v grep|cut -f2 -d '\'|wc -l`
if [ "$temp" \< 1 ]
then
shutdown -h now
fi
done

Los cambios en la linea temp=`ps x|grep urpmi|grep -v halt|grep -v grep|cut -f2 -d '\'|wc -l` se deben a que a temp no se le estaba asignando nada en la forma en que estaba escrito originalmente, ademas de que como nombramos nuestro script urpmi-halt estamos quitando nuestro script de la lista de procesos.

El \< en el if le esta diciendo que lo que sigue es el caracter < y no que estamos intentando redirigir nada.

P.D. Para depurar scripts recuerda: bash -x nombre-script

LA' YUME' NUM T'OX MUK'IL IN TIAL

Yo hago shutdown

mientras esta en urpmi o algo y aun no termina
el terminal no lee la entrada del teclado, hasta que no vuelva a estar operativo el cursor
por ejemplo mientras instalo urpmi paquete y el urpmi va trabajando, puedo y lo hago escribir urpmi otro_paquete
Una vez ha instalado paquete, en el terminal se ejecuta urpmi otro_paquete.
Alguna vez he escrito poweroff (es que me gusta mas que shutdown) y te juro que se apaga correctamente despues de hacer lo que lanzaste primero.
Eso si
no agas urpmi --auto --auto-update &
(quita el &) ;)