¿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

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á.


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 .


+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í.


+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.


+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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.