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?


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.


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.


+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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.