Odpowiedzi:
Nie ma potrzeby wielokrotnego uruchamiania ps, aby wyświetlić listę wszystkich procesów i grep przez wyjście. Ustaw proces w tle za pomocą Ctrl-Z, a następnie uruchom
bg %1 ; wait %1 ; shutdown -h now
Jeśli masz uruchomione inne zadania w tle, po naciśnięciu klawiszy Ctrl-Z otrzymasz inny typ zadania zamiast [1]. Jeśli tak, użyj tego zamiast tego.
Możesz zrobić coś takiego, co sprawdzi, czy proces działa co 5 sekund i podejmie odpowiednie działania:
while true; do
if ps -ef | grep -q '[l]ong-running-process'; then
sleep 5
else
sudo poweroff
fi
done
Zwróć uwagę na nawiasy kwadratowe w grep
wyrażeniu. Ma to na celu zapewnienie, że grep
proces nie zostanie dopasowany, jeśli znajdzie się na ps
liście. Wystarczające jest otoczenie dowolnego znaku nawiasami kwadratowymi.
Robię to cały czas.
&&
polecenie.fg && shutdown -h now
do:
Alternatywnie możesz sondować zgodnie z sugestiami zawartymi w innych odpowiedziach takich jak to:
while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Jeśli znasz pid, możesz uruchomić to:
while ps -p $PID; sleep 5; done; shutdown -h now
Aby uruchomić bez echa z ps, wykonaj następujące czynności:
while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now
I wreszcie, aby uruchomić go w tle bez żadnych danych wyjściowych:
(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &
Rozwiązanie Scotta jest dobre, ale eliminuje potrzebę grep
ciągłego powtarzania, jeśli znasz już pid. I o wiele szybciej jest pisać.: P
Utwórz skrypt powłoki, aby uruchomić oba procesy:
MyShellScript.txt:
#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now
Po zapisaniu tego w katalogu, w którym rozpoczyna się dany proces, wykonaj:
chmod +x MyShellScript.txt
Następnie, gdy chcesz uruchomić polecenie, po prostu wpisz, ./MyShellScript.txt
a zrobi to jedno i drugie.
&&
zadziała tylko wtedy, gdy poprzednie polecenie zakończyło się powodzeniem. Jeśli chcesz, aby działał, nawet jeśli polecenie nie powiedzie się, użyj;
zamiast tego.