Wie kann ich einem bereits laufenden Prozess einen zusätzlichen Befehl zum Herunterfahren hinzufügen?

11

Ich vergesse regelmäßig && shutdown -h now, einen lang laufenden Prozess zu ergänzen . Gibt es eine Möglichkeit, einen shutdown -h nowBefehl hinzuzufügen, nachdem der erste Befehl aufgerufen wurde? Es ist nicht beabsichtigt, den laufenden Prozess zu unterbrechen. Vielleicht ist es möglich, die PID zu sehen?

brubaker
quelle
Ich hoffe, Sie erkennen, dass alles, was danach kommt &&, nur ausgeführt wird, wenn der vorherige Befehl erfolgreich war. Wenn Sie möchten, dass es ausgeführt wird, auch wenn der Befehl fehlschlägt, verwenden Sie ;stattdessen.
Zoke

Antworten:

13

Es ist nicht erforderlich, ps wiederholt auszuführen, um alle Prozesse aufzulisten und die Ausgabe zu durchsuchen. Hintergrund des Vorgangs mit Strg-Z, dann ausführen

bg %1 ; wait %1 ; shutdown -h now

Wenn andere Hintergrundjobs ausgeführt werden, erhalten Sie bei gedrückter Strg-Z-Taste anstelle von [1] eine andere Jobspezifikation. Wenn ja, verwenden Sie das stattdessen.

psusi
quelle
3

Sie können Folgendes tun, um zu überprüfen, ob der Prozess alle 5 Sekunden ausgeführt wird, und geeignete Maßnahmen zu ergreifen:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

Beachten Sie die eckigen Klammern im grepAusdruck. Dies soll sicherstellen, dass der grepProzess nicht übereinstimmt, wenn er in der psListe landet . Es ist ausreichend, ein einzelnes Zeichen mit eckigen Klammern zu umgeben.

Scott Severance
quelle
+1 da es funktioniert. Nicht so, wie ich es getan hätte.
Zoke
@Zoke: Wenn es einen anderen Weg gibt, wäre ich interessiert.
Scott Severance
Hat auch eine Antwort gepostet. Probieren Sie es aus, wenn Sie möchten.
Zoke
Sie können auch kill -0 (pid) verwenden, um die Existenz eines Prozesses zu überprüfen, ohne ihn zu beenden.
flauschig
3

Ich mache das die ganze Zeit.

  1. Starten Sie den Prozess.
  2. Erkenne, dass ich vergessen habe, meinen &&Befehl auszuführen .
  3. Drücken Sie Ctrl+ Z, um den Vorgang anzuhalten und zur Shell zurückzukehren.
  4. Lauf fg && shutdown -h nowzu:
    1. Stellen Sie den gerade angehaltenen Prozess in den Vordergrund und setzen Sie ihn fort.
    2. Nachdem es beendet ist, wird es ausgeführt, was Sie ausführen wollten.

Alternativ können Sie wie in anderen Antworten vorgeschlagen abfragen:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Naftuli Kay
quelle
Das wird sofort heruntergefahren.
Psusi
Die fg wird sofort fertiggestellt, also ...
psusi
@psusi nein wird es nicht
Walking Wiki
@ WalkingWiki, oh komisch, du hast recht. Ich schwöre, ich habe dies 2012 getestet und es wurde sofort abgeschlossen.
Psusi
1

Wenn Sie die PID kennen, können Sie Folgendes ausführen:

while ps -p $PID; sleep 5; done; shutdown -h now

Um ohne Echo von ps zu laufen, gehen Sie wie folgt vor:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

Und schließlich, um es im Hintergrund ohne Ausgabe auszuführen:

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

Scotts Lösung ist gut, aber dies beseitigt die Notwendigkeit, grepimmer wieder zu arbeiten, wenn Sie die PID bereits kennen. Und es ist viel schneller einzugeben .: P.

Zoke
quelle
0

Erstellen Sie ein Shell-Skript, um beide Prozesse auszuführen:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

Nachdem Sie dies in dem Verzeichnis gespeichert haben, in dem Sie den angegebenen Prozess starten, führen Sie Folgendes aus:

chmod +x MyShellScript.txt

Wenn Sie dann den Befehl ausführen möchten, geben Sie einfach ein ./MyShellScript.txtund er erledigt beides für Sie.

Chris Curry
quelle