Risposte:
Non è necessario eseguire ripetutamente ps per elencare tutti i processi e passare attraverso l'output. Esegui lo sfondo del processo con ctrl-Z, quindi esegui
bg %1 ; wait %1 ; shutdown -h now
Se hai altri lavori in background in esecuzione, ti verrà dato un altro jobspec invece di [1] quando premi ctrl-z. In tal caso, utilizzare quello.
Potresti fare qualcosa del genere, che controllerà se il processo è in esecuzione ogni 5 secondi e prenderà le misure appropriate:
while true; do
if ps -ef | grep -q '[l]ong-running-process'; then
sleep 5
else
sudo poweroff
fi
done
Nota le parentesi quadre grep
nell'espressione. Questo per garantire che il grep
processo non venga abbinato se finisce ps
nell'elenco. È sufficiente circondare un singolo carattere con parentesi quadre.
Lo faccio sempre.
&&
comando.fg && shutdown -h now
a:
In alternativa, puoi eseguire il polling come suggerito in altre risposte come questa:
while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Se conosci il pid puoi eseguire questo:
while ps -p $PID; sleep 5; done; shutdown -h now
Per eseguire senza eco da ps, procedere come segue:
while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now
E infine per eseguirlo in background senza alcun output:
(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &
La soluzione di Scott è buona, ma ciò elimina la necessità di grep
ripetere se già conosci il pid. Ed è molto più veloce digitare.: P
Crea uno script shell per eseguire entrambi i processi:
MyShellScript.txt:
#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now
Dopo averlo salvato nella directory in cui si avvia il processo specificato, eseguire una:
chmod +x MyShellScript.txt
Quindi, quando vuoi eseguire il comando, digita ./MyShellScript.txt
e farà entrambe le cose per te.
&&
verrà eseguito solo se il comando precedente ha avuto successo. Se si desidera che venga eseguito anche se il comando non riesce, utilizzare;
invece.