Jak dodać do już uruchomionego procesu dodatkowe polecenie „zamknij”?

11

Regularnie zapominam dodawać && shutdown -h nowdo długotrwałego procesu. Czy jest jakiś sposób na dodanie shutdown -h nowpolecenia po wywołaniu pierwszego polecenia? Jego celem nie jest przerywanie trwającego procesu. Może można obejrzeć PID?

brubaker
źródło
Mam nadzieję, że zdajesz sobie sprawę, że wszystko, co nastąpi później, &&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.
Zoke 30.01.12

Odpowiedzi:

13

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.

psusi
źródło
3

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 grepwyrażeniu. Ma to na celu zapewnienie, że grepproces nie zostanie dopasowany, jeśli znajdzie się na psliście. Wystarczające jest otoczenie dowolnego znaku nawiasami kwadratowymi.

Scott Severance
źródło
+1, ponieważ działa. Nie tak, jak bym to zrobił.
Zoke 30.01.12
@Zoke: Jeśli istnieje inny sposób, byłbym zainteresowany.
Scott Severance
Wysłałem również odpowiedź. Sprawdź, jeśli chcesz.
Zoke 30.01.12
Możesz także użyć kill -0 (pid), aby sprawdzić istnienie procesu bez jego zabijania.
puszysty
3

Robię to cały czas.

  1. Rozpocznij proces.
  2. Uświadom sobie, że zapomniałem wykonać &&polecenie.
  3. Naciśnij Ctrl+, Zaby zawiesić proces i wrócić do powłoki.
  4. Uruchom fg && shutdown -h nowdo:
    1. Wyznacz pierwszy plan i wznów proces, który właśnie zawiesiłeś.
    2. Następnie, po zakończeniu, uruchomi to, co chciałeś uruchomić.

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
Naftuli Kay
źródło
To się natychmiast zamknie.
psusi
FG kończy się od razu, więc ...
psusi
@psusi nie, nie będzie
Walking Wiki
@WalkingWiki, och dziwne, masz rację. Przysięgam, że przetestowałem to w 2012 roku i od razu się zakończyło.
psusi
1

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ę grepciągłego powtarzania, jeśli znasz już pid. I o wiele szybciej jest pisać.: P

Zoke
źródło
0

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.txta zrobi to jedno i drugie.

Chris Curry
źródło