¿Cómo puedo agregar a un proceso que ya se está ejecutando un comando adicional de 'apagado'?

11

De manera regular, me olvido de agregar && shutdown -h nowa un proceso de larga duración. ¿Hay alguna forma de agregar un shutdown -h nowcomando después de invocar el primer comando? No tiene la intención de interrumpir el proceso en curso. Tal vez es posible ver el PID?

brubaker
fuente
Espero que te des cuenta de que lo que viene después &&solo se ejecutará si el comando anterior fue exitoso. Si desea que se ejecute incluso si el comando falla, use ;en su lugar.
Zoke

Respuestas:

13

No es necesario ejecutar ps repetidamente para enumerar todos los procesos y grep a través de la salida. Ejecute el proceso en segundo plano con Ctrl-Z, luego ejecute

bg %1 ; wait %1 ; shutdown -h now

Si tiene otros trabajos en segundo plano en ejecución, se le dará una especificación de trabajo diferente en lugar de [1] cuando presione ctrl-z. Si es así, use eso en su lugar.

psusi
fuente
3

Podría hacer algo como esto, que verificará si el proceso se ejecuta cada 5 segundos y tomará las medidas adecuadas:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

Tenga en cuenta los corchetes en la grepexpresión. Esto es para garantizar que el grepproceso no coincida si termina en la pslista. Rodear cualquier carácter con corchetes es suficiente.

Scott Cesantía
fuente
+1 ya que funciona. No de la forma en que lo habría hecho aunque.
Zoke
@Zoke: Si hay otra forma, me interesaría.
Scott Severance
Publicó una respuesta también. Compruébalo si quieres.
Zoke
También puede usar kill -0 (pid) para verificar la existencia de un proceso sin matarlo.
esponjoso
3

Hago esto todo el tiempo.

  1. Inicia el proceso.
  2. Date cuenta de que olvidé hacer mi &&comando.
  3. Presiona Ctrl+ Zpara suspender el proceso y volver al shell.
  4. Corre fg && shutdown -h nowa:
    1. En primer plano y reanudar el proceso que acaba de suspender.
    2. Luego, una vez que termine, ejecutará lo que quería ejecutar.

Alternativamente, puede sondear como se sugiere en otras respuestas como esta:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Naftuli Kay
fuente
Eso se cerrará de inmediato.
psusi
Los ultima fg de inmediato, así que ...
psusi
@psusi no, no lo hará
Walking Wiki
@WalkingWiki, oh raro, tienes razón. Juro que probé esto en 2012 y se completó de inmediato.
psusi
1

Si conoce el pid, puede ejecutar esto:

while ps -p $PID; sleep 5; done; shutdown -h now

Para ejecutar sin eco desde ps haga esto:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

Y finalmente para ejecutarlo en segundo plano sin ningún resultado:

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

La solución de Scott es buena, pero esto elimina la necesidad de greprepetir una y otra vez si ya conoce el pid. Y es mucho más rápido escribir: p

Zoke
fuente
0

Cree un script de shell para ejecutar ambos procesos:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

Después de guardar esto en el directorio donde inicia el proceso dado, haga lo siguiente:

chmod +x MyShellScript.txt

Luego, cuando desee ejecutar el comando, simplemente escriba ./MyShellScript.txty lo hará por usted.

Chris Curry
fuente