Gibt es eine Möglichkeit, serielle Tasks auf dem Terminal bereitzustellen, während eine Task ausgeführt wird (ohne eine Datei zu verwenden)?

14

Angenommen, es gibt zwei Aufgaben t1, t2die wie folgt seriell ausgeführt werden können:

t1 ; t2
# OR
t1 && t2

Angenommen, ich habe vergessen zu rennen t2und t1renne bereits. kann ich t2die Pipeline erweitern, damit sie nach t1Abschluss ausgeführt wird?

Abhimanyu Gupta
quelle

Antworten:

19

Ja, du kannst:

  1. Halten Sie den aktuell ausgeführten Job mit dem Unterbrechungszeichen an, indem Sie Ctrl+ drücken Z.
  2. Geben Sie fgoder ein %, fügen Sie der Liste das hinzu, was Sie möchten, und führen Sie es aus, z. B .:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Da fgder Rückgabewert des wiederaufgenommenen Jobs zurückgegeben wird, mögen &&und ||arbeiten die Listenoperatoren wie erwartet:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL sagt über das Suspend-Zeichen:

Wenn Sie das Unterbrechungszeichen (normalerweise - ) eingeben ^Z, während ein Prozess ausgeführt wird, wird dieser Prozess gestoppt und die Steuerung an zurückgegeben . (…) Der Benutzer kann dann den Status dieses Auftrags ändern, indem er den Befehl verwendet, um ihn im Hintergrund fortzusetzen , den Befehl, um ihn im Vordergrund fortzusetzen, oder den Befehl, um ihn abzubrechen. A wird sofort wirksam und hat den zusätzlichen Nebeneffekt, dass anstehende Ausgabe und Druckkopf verworfen werden.ControlZbashbgfgkill^Z

fgwird in man bash/ SHELL BUILTIN COMMANDS erklärt :

fg [ jobspec ]
Lebenslauf jobspec im Vordergrund, und es der aktuelle Job machen. Wenn jobspec nicht vorhanden ist, wird der Shell-Begriff des aktuellen Jobs verwendet. Der Rückgabewert ist der des Befehls, der in den Vordergrund gestellt wird, oder Fehler, wenn die Jobsteuerung deaktiviert ist oder wenn die Jobsteuerung aktiviert ist, wenn jobspec keinen gültigen Job angibt oder jobspec einen Job angibt, der ohne Jobsteuerung gestartet wurde .

Weiterführende Literatur (außer man bash) zur Jobkontrolle:

Dessert
quelle
+1 aber es ist eine Schande, dass dies nicht funktioniert, wenn Sie t3in t1; t2; t3oder vergessen t1 && t2 && t3.
JoL
@JoL Das stimmt - ^Z^Zund %-;%+;t3ist in einigen Fällen gut genug, aber es ist weit davon entfernt, eine echte Lösung für das Problem zu sein.
Dessert
2

Ich habe diese Methode hier gesehen: /superuser/334272/how-to-run-a-command-after-andalready-running-existing-one-finishes

Wenn Sie zuerst Ctrl+ tun z, um den laufenden Befehl zu stoppen (anzuhalten), führen Sie den fehlenden Befehl wie fg && ./missed_cmd.shfolgt aus : und er wird ausgeführt, sobald der fgVorgang abgeschlossen ist.

Der fg(Vordergrundbefehl) schaltet den angehaltenen Auftrag online und stellt &&sicher, dass der fehlgeschlagene Befehl nur ausgeführt wird, wenn der erste Befehl erfolgreich ist.

George Udosen
quelle