Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
hikaru
Beiträge: 9909
Registriert: 09.04.2008 12:48:59

Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von hikaru » 18.10.2017 10:58:07

Hallo,

Wenn ich zwei Shell-Kommandos nacheinander absetzen möchte, dann kann ich das machen:

Code: Alles auswählen

$ kommando1; kommando2
Das muss ich aber vorher wissen.

Wenn ich ein Shell-Kommando gestartet habe und mir fällt hinterher ein, dass ich gern ein zweites Kommando starten möchte, funktioniert das:

Code: Alles auswählen

$ kommando1
[Ctrl+z]
$ bg
$ kommando2
Dann laufen aber beide Kommandos parallel und treten sich womöglich gegenseitig auf die Füße.

Gibt es einen Mittelweg/eine Kombination beider Möglichkeiten, die mir erlaubt, nachträglich ein zweites Kommando abzusetzen, das aber erst gestartet wird, nachdem da erste beendet ist?
Ich weiß, dass ich mir ein Script schreiben könnte, das anhand irgendwelcher Parameter prüft, ob das erste Kommando noch läuft und dann ggf. das zweite Kommando startet. Das ist mir aber ehrlich gesagt zu kompliziert, denn wenn das erste Kommando selbst Sub-Aufrufe macht, dann muss man es sehr genau kennen um überhaupt die Parameter aufstellen zu können. Ich suche nach einer universellen Lösung.

jeff84
Beiträge: 315
Registriert: 15.07.2009 13:32:36

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von jeff84 » 18.10.2017 11:06:56

Code: Alles auswählen

~ % sleep 30                                                                                                                  
^Z
[1]  + 22187 suspended  sleep 30
~ % fg; echo done                                                                                                          
[1]  + 22187 continued  sleep 30
done

Benutzeravatar
smutbert
Beiträge: 6344
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von smutbert » 18.10.2017 11:07:08

etwa so?

Code: Alles auswählen

sleep 20s &
wait && echo "zweiter Befehl"

Liffi
Beiträge: 2286
Registriert: 02.10.2004 01:33:05

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von Liffi » 18.10.2017 11:08:24

Du könntest ein Skript schreiben, das in einer Schleife sich die Ausgabe von "jobs" anschaut und erst, wenn der aktuelle Job abgearbeitet ist, kommando2 startet.

EDIT:: die beiden anderen Lösungen sind natürlich deutlich schöner als meine :-)

MSfree
Beiträge: 3483
Registriert: 25.09.2007 19:59:30

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von MSfree » 18.10.2017 11:14:26

hikaru hat geschrieben: ↑ zum Beitrag ↑
18.10.2017 10:58:07
Gibt es einen Mittelweg/eine Kombination beider Möglichkeiten, die mir erlaubt, nachträglich ein zweites Kommando abzusetzen, das aber erst gestartet wird, nachdem da erste beendet ist?
Eventuell ist batch etwas für dich, siehe:

Code: Alles auswählen

man batch

Benutzeravatar
smutbert
Beiträge: 6344
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von smutbert » 18.10.2017 11:17:08

Das mit den jobs finde ich auch toll, wenn man eine bestimmte Anzahl an Befehlen parallel laufen lassen will, hab ich hier zum Überprüfen von vielen flac-Dateien gemacht (immer maximal 8 gleichzeitig): viewtopic.php?t=159532

Benutzeravatar
hikaru
Beiträge: 9909
Registriert: 09.04.2008 12:48:59

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von hikaru » 18.10.2017 11:46:47

jeff84 hat geschrieben: ↑ zum Beitrag ↑
18.10.2017 11:06:56

Code: Alles auswählen

~ % sleep 30                                                                                                                  
^Z
[1]  + 22187 suspended  sleep 30
~ % fg; echo done                                                                                                          
[1]  + 22187 continued  sleep 30
done
Das sieht auf den ersten Blick praktikabel aus. Danke!
Wenn ich das auf die Schnelle aber richtig sehe, dann funktioniert das nur beim ersten mal sauber. Wenn ich nach dem Absetzen des zweiten Kommandos ein zweites mal Ctrl+z drücke um ein drittes Kommando abzusetzen, dann startet sofort das zweite Kommando. Man kann zwar auch das wieder unterbrechen, aber beim Fortsetzen stimmt dann die Reihenfolge nicht mehr.

smutbert hat geschrieben: ↑ zum Beitrag ↑
18.10.2017 11:07:08
etwa so?

Code: Alles auswählen

sleep 20s &
wait && echo "zweiter Befehl"
Wenn ich das richtig sehe funktioniert das nur, wenn der erste Befehl nur aus einem Prozess besteht.

Liffi hat geschrieben: ↑ zum Beitrag ↑
18.10.2017 11:08:24
Du könntest ein Skript schreiben, das in einer Schleife sich die Ausgabe von "jobs" anschaut und erst, wenn der aktuelle Job abgearbeitet ist, kommando2 startet.
Wenn ich die Manpage richtig lese, dann arbeitet auch jobs auf pid-Basis, richtig?

MSfree hat geschrieben: ↑ zum Beitrag ↑
18.10.2017 11:14:26
Eventuell ist batch etwas für dich
Ja, sieht nach einem brauchbaren Alternativansatz aus. Danke!
Hintergrund: Ich wollte über Nacht ein paar Backports erstellen. Dass es über Nacht mehr als einer werden kann, wenn der Rechner ohnehin läuft fiel mir aber erst nach dem Start des ersten Jobs ein. Ich hätte aber gern vermieden, das sie sich gegenseitig CPU und Disk-I/O klauen.

Benutzeravatar
heisenberg
Beiträge: 1324
Registriert: 04.06.2015 01:17:27

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von heisenberg » 18.10.2017 11:58:23

Batch hört sich IMHO gut an.

Ansonten ein kurzes bash script namens execute_after_pid:

Code: Alles auswählen

#!/bin/bash

# $1 ist die PID nachdem das Programm laufen soll
WANTED_PID="$1"

# die PID-wegshiften, alles was danach kommt ist das
# auszuführende Kommando mit Argumenten
shift

while :;do
        # Check: Das Kommando nur ausführen wenn Prozess mit
        # PID $WANTED_PID nicht mehr läuft
        if ! kill -0 $WANTED_PID;then
                "$@" # -- Ausführung des Befehls inkl. Quotes.
                exit $?
        fi
        sleep 30
done
Zuletzt geändert von heisenberg am 18.10.2017 12:09:27, insgesamt 2-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 5054
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell-Kommando nachträglich nach laufendem Kommando absetzen?

Beitrag von Meillo » 18.10.2017 12:04:16

Cooler Thread! Hab mit ``fg; echo done'' was Nuetzliches gelernt, aber auch die anderen Beitraege sind interessant. :-)
Use ed(1) once in a while!

Antworten