¿Cómo ejecutar el comando después del comando actual en ejecución en bash?

18

Estoy descargando el archivo con wget, y quiero apagar mi computadora después de que la descarga haya finalizado, pero necesito ir a algún lugar ahora :) ¿Es posible ejecutar el comando en bash exactamente cuando finalice el proceso?

Sé que esto funciona:

wget http://example.com/file.rar; apagado ahora

Pero, ¿y si escribo solo:

wget http://example.com/file.rar
inothemo
fuente
2
Considere usar && y || en lugar de ;. && y || verifique el valor de retorno del comando anterior antes de ejecutar el siguiente comando ... en caso de que wget falle, es posible que no desee cerrar.
KFro

Respuestas:

31

Puedes hacer algo como esto:

  1. detener la ejecución de wget con ctrl-z (no se detiene, se suspende)
  2. ponerlo en segundo plano (bg)
  3. ejecutar: esperar; apagado -h ahora

wait esperará a que todos los programas se ejecuten en segundo plano desde el shell actual, es decir, este wget.

Después de que la espera termine, el apagado continuará.


fuente
no olvide poner en primer plano (fg) su instancia de wget cuando haya terminado. Si wget ya se está ejecutando, puede ponerlo en primer plano con ^ z (control-z).
Andrew Scagnelli
44
No es necesario a menos que realmente quieras ver la barra de progreso.
dmckee
No es necesario, ya que deja la máquina sola y luego se apaga.
Wolf
11

En otro caparazón, use

ps -u <your username> | grep wget

para encontrar el PID del comando que desea esperar, luego

wait <PID>; shutdown -h now

para que el apagado no se ejecute hasta que el proceso haya finalizado. Ver también la respuesta de depesz .

dmckee
fuente
+1, solo una nota: waitsolo funcionará para los comandos iniciados desde el mismo shell
Chriki
4

Mi solución es esta: suspenda su tarea de larga duración con Control + Z, luego escriba algo como:

fg; echo "Done!"

Si desea ejecutar una reacción diferente en función del éxito o el fracaso de su comando, use && y || como operadores de cortocircuito.

fg && echo "Success!" || echo "Failure!"

EDITAR: Esto no funcionará con sudo, porque le pedirá su contraseña. En consecuencia, eliminé los ejemplos usando sudo. Si necesita sudo para la segunda tarea, use otro de los métodos publicados aquí.

Por otro lado, creo que tanto GNOME como KDE ofrecen formas de activar un apagado / reinicio sin usar sudo, enviando una señal D-Bus adecuada o algo así.

Ryan C. Thompson
fuente
+1 para fg..., pero sudopodría ser un problema si te solicita una contraseña
mark4o
Hmm Sí, no he usado este truco para sudar cosas cuando algo termina. Para sudo, necesitarías un truco diferente. Editaré mi publicación en consecuencia.
Ryan C. Thompson
Para mi propósito, esta respuesta es superior, ya que pone el proceso automáticamente en primer plano
Cookie
Además, las contraseñas para sudo pueden deshabilitarse (por usuario y por comando): si el usuario puede apagarse a través de sudo esta vez, es posible que siempre pueda hacerlo. Un apagado hostil puede no ser tan peligroso en algunos casos, ciertamente no tan peligroso como un acceso de invitado comprometido en una máquina en funcionamiento.
Cookie
1

Sí, simplemente escriba su segundo comando y presione Entrar. Si su programa actual está desplazando texto, no puede ver lo que está escribiendo correctamente, así que observe sus teclas para hacerlo bien.

Una forma más inteligente es cambiar a otro TTY (CTRL + ALT + F1 a F6) y ejecutar el comando simultáneamente, o si está utilizando un programa de línea de comandos como pantalla, podría crear una nueva ventana en él.

Tamara Wijsman
fuente
+1 para la primera opción. Me temo que no entiendo cómo se supone que funciona la segunda opción.
innaM
Presionar, por ejemplo, CTRL + ALT + F2 lo cambiará a una nueva segunda consola donde puede iniciar sesión y escribir un comando, de esta manera puede ejecutar un segundo comando allí. En segundo lugar, si descarga la pantalla (un programa para usar su consola de una manera más elegante), puede abrir una segunda pestaña / ventana donde puede volver a escribir comandos, sin tener que iniciar sesión nuevamente. Pero como lo necesita simultáneamente, puede quedarse con la opción 1, no creo que haya otra forma de lograr el mismo efecto. A menos que use otro TTY / ventana para verificar a través de un script si el proceso aún se está ejecutando. :-P
Tamara Wijsman
Use el PID de espera de la respuesta de dmckee
Cookie
1

Si quieres ponerte elegante, verifica el estado de devolución del wget y solo apaga si fue exitoso.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi
Doug Harris
fuente
2
Este es un buen enfoque cuando wgetse realizan scripts, pero mientras se ejecuta no se le solicita que vuelva a generar la prueba.
dmckee
Puedes combinar esto con mi truco Control-Z y fg para evitarlo.
Ryan C. Thompson