Respuestas:
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.
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 grep
expresión. Esto es para garantizar que el grep
proceso no coincida si termina en la ps
lista. Rodear cualquier carácter con corchetes es suficiente.
Hago esto todo el tiempo.
&&
comando.fg && shutdown -h now
a:
Alternativamente, puede sondear como se sugiere en otras respuestas como esta:
while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
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 grep
repetir una y otra vez si ya conoce el pid. Y es mucho más rápido escribir: p
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.txt
y lo hará por usted.
&&
solo se ejecutará si el comando anterior fue exitoso. Si desea que se ejecute incluso si el comando falla, use;
en su lugar.