Yanıtlar:
Tüm işlemleri listelemek ve çıktı boyunca grep'i tekrarlamak için ps'yi tekrar tekrar çalıştırmaya gerek yoktur. İşlemi ctrl-Z ile arka planlayın, ardından çalıştırın
bg %1 ; wait %1 ; shutdown -h now
Çalışmakta olan başka arka plan işleriniz varsa, ctrl-z yaptığınızda [1] yerine farklı bir jobpec verilir. Öyleyse, bunu kullanın.
Sürecin her 5 saniyede bir çalışıp çalışmadığını kontrol edecek ve uygun eylemi gerçekleştirecek böyle bir şey yapabilirsiniz:
while true; do
if ps -ef | grep -q '[l]ong-running-process'; then
sleep 5
else
sudo poweroff
fi
done
İfadedeki köşeli parantezleri not edin grep
. Bunun amacı, grep
işlemin ps
listede bitmesi durumunda eşleşmemesini sağlamaktır . Herhangi bir karakterin köşeli parantez içine alınması yeterlidir.
Bunu her zaman yaparım.
&&
.fg && shutdown -h now
:
Alternatif olarak, aşağıdaki gibi diğer yanıtlarda önerildiği gibi anket yapabilirsiniz:
while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Pid'i biliyorsanız, bunu çalıştırabilirsiniz:
while ps -p $PID; sleep 5; done; shutdown -h now
PS'den yankı olmadan çalıştırmak için şunu yapın:
while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now
Ve son olarak herhangi bir çıktı olmadan arka planda çalıştırmak için:
(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &
Scott'ın çözümü iyi bir çözümdür, ancak grep
pid'i zaten biliyorsanız, tekrar tekrar yapma ihtiyacını ortadan kaldırır . Ve yazmak çok daha hızlı.: P
Her iki işlemi de çalıştırmak için bir kabuk komut dosyası oluşturun:
MyShellScript.txt:
#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now
Bunu verilen işlemi başlattığınız dizine kaydettikten sonra şunları yapın:
chmod +x MyShellScript.txt
Sonra komutu çalıştırmak istediğinizde sadece yazın ./MyShellScript.txt
ve her ikisini de sizin için yapar.
&&
sadece önceki komut başarılı olursa çalışır. Komut başarısız olsa bile çalışmasını istiyorsanız bunun;
yerine kullanın.