Ich muss eine Menge von verschiedenen Dateien in verschiedene Ordner kopieren. Ich kann alle meine Kopierbefehle zu einem Bash-Skript hinzufügen und das dann ausführen, aber dann muss ich warten, bis es beendet ist, wenn ich dieser "Kopierwarteschlange" weitere Befehle hinzufügen möchte.
Gibt es eine Möglichkeit, Befehle als Warteschlange auszuführen und dieser Warteschlange weitere Befehle hinzuzufügen, während die Dinge laufen?
Anders erklärt, möchte ich eine lange laufende Aufgabe starten. Während das läuft, möchte ich ein anderes starten, das nicht wirklich startet, bis das erste fertig ist. Und dann fügen Sie eine weitere nach der letzten hinzu und so weiter. Ist das irgendwie möglich
Antworten:
Das
at
Dienstprogramm, das am besten dafür bekannt ist, Befehle zu einem bestimmten Zeitpunkt auszuführen, verfügt auch über eine Warteschlangenfunktion und kann aufgefordert werden, Befehle jetzt auszuführen. Es liest den Befehl, der von der Standardeingabe ausgeführt werden soll.Der
batch
Befehl ist äquivalent zuat -q b -m now
(-m
was bedeutet, dass die Befehlsausgabe, falls vorhanden, an Sie gesendet wird, wie dies bei cron der Fall ist). Nicht alle Unix-Varianten unterstützen Warteschlangennamen (-q myqueue
). Sie können auf eine einzelne Warteschlange mit dem Namen beschränkt seinb
. Linuxat
ist auf Warteschlangennamen mit einem Buchstaben beschränkt.quelle
now
nicht-t now
, sorry. Ich hatte nicht bemerkt, dass ich einen Fehler im Beispielcode hatte.Fügen Sie
&
an das Ende Ihres Befehls einen Text an, um ihn in den Hintergrund und anschließend in den Hintergrund zu verschieben,wait
bevor Sie den nächsten Befehl ausführen . Zum Beispiel:quelle
wait
Vorgang abzubrechen ? Es scheint für alle meine Killshots undurchlässig zu sein.wait
stoppt einfach den Job, bis die vorherigen beendet sind.nohup
?Sowohl Brad als auch Mankoffs Lösungen sind gute Vorschläge. Eine andere, die einer Kombination von beiden ähnelt, wäre, GNU Screen zu verwenden, um Ihre Warteschlange zu implementieren. Dies hat den Vorteil, dass es im Hintergrund ausgeführt werden kann, dass Sie es jederzeit überprüfen können und dass beim Einreihen neuer Befehle diese einfach in den Puffer eingefügt werden, damit sie ausgeführt werden, nachdem die vorherigen Befehle beendet wurden.
Erster Lauf:
( Übrigens , jetzt ist ein guter Zeitpunkt, um mit einigen großartigen .screenrc-Dateien zu spielen. )
Dadurch wird eine Hintergrundbildschirmsitzung für die von Ihnen angegebene Warteschlange erstellt.
Stellen Sie nun so viele Befehle in die Warteschlange, wie Sie möchten:
Ich führe oben mehrere Befehle nur zum Testen aus. Ihr Anwendungsfall würde wahrscheinlich eher so aussehen:
Beachten Sie, dass das "^ M" in meiner Zeile oben eine Möglichkeit ist, eine eingebettete neue Zeile zu erhalten, die später interpretiert wird, nachdem der Bildschirm sie in Ihre vorhandene Bash-Shell eingefügt hat. Verwenden Sie "CTL-V", um diese Sequenz abzurufen.
Es wäre ziemlich einfach, einige einfache Shell-Skripte zu erstellen, um dies zu automatisieren und Befehle in die Warteschlange zu stellen. Wann immer Sie den Status Ihrer Hintergrundwarteschlange überprüfen möchten, können Sie eine erneute Verbindung herstellen über:
Technisch gesehen müssen Sie Ihre Bildschirmsitzung nicht einmal benennen, und es funktioniert einwandfrei, aber sobald Sie sich darauf einlassen, möchten Sie sowieso immer eine laufen lassen. ;-)
Wenn Sie dies tun, ist es natürlich auch sinnvoll, eine der aktuellen Windows-Warteschlangen zu benennen und Folgendes zu verwenden:
quelle
Es gibt ein Dienstprogramm, das ich mit großem Erfolg für genau den Anwendungsfall verwendet habe, den Sie beschreiben. Vor kurzem habe ich meinen primären Laptop auf neue Hardware umgestellt, wobei einige Dateien auf einen NAS und der Rest auf den neuen Computer verschoben wurden.
So habe ich es gemacht.
Richten Sie alle an einer Netzwerkverbindung beteiligten Computer so ein, dass sie sich gegenseitig erreichen können.
Installieren Sie auf dem Computer, von dem Sie Dateien verschieben (im Folgenden als Quellcomputer bezeichnet), rsync mit
apt-get install rsync
und den Task-Spooler mit geheimer Sauce (Website http://vicerveza.homeunix.net/~viric/soft/ts/ ). Wenn Sie unter Debian arbeiten,ts
lautet der Paketname fürtask-spooler
und die ausführbare Datei wird umbenannttsp
, um Namenskonflikte mit derts
ausführbaren Datei aus demmoreutils
Paket zu vermeiden . Das von der Website verlinkte Debian-Paket ist perfekt auf Ubuntu mitdpkg -i task-spooler_0.7.3-1_amd64.deb
oder ähnlichem installierbar .Stellen Sie außerdem sicher, dass auf allen Computern SSH mit installiert ist
apt-get install openssh-server
. Auf dem Quellcomputer müssen Sie SSH einrichten, um eine kennwortlose Anmeldung auf den Zielcomputern zu ermöglichen. Die am häufigsten verwendete Methode ist die Authentifizierung mit öffentlichen Schlüsselnssh-agent
(siehe https://www.google.se/search?q=ssh+public+key+authentication für Beispiele hierfür), aber ich verwende manchmal eine einfachere Methode, die einfach funktioniert auch mit Passwortauthentifizierung. Fügen Sie Ihrer SSH-Client-Konfiguration Folgendes hinzu (entweder~/.ssh/config
oder/etc/ssh/ssh_config
):Öffnen Sie dann ein Terminal auf dem Quellcomputer, melden Sie sich mit an
ssh target1
, authentifizieren Sie sich wie gewohnt und lassen Sie dieses Terminal geöffnet. Beachten Sie, dass es eine Socket-Datei mit dem Namen~/.ssh/master-user@target1:22
gibt. Dies ist die Datei, die eine authentifizierte Mastersitzung geöffnet hält und nachfolgende kennwortlose Verbindungen zulässtuser
(solange die Verbindung denselben Ziel-Hostnamen und -Port verwendet).Zu diesem Zeitpunkt müssen Sie sicherstellen, dass Sie sich anmelden können, ohne zur Authentifizierung bei den Zielcomputern aufgefordert zu werden.
Führen Sie nun
ts rsync -ave ssh bigfile user@target1:
eine einzelne Datei oderts rsync -ave ssh bigdir user@target1:
ein Verzeichnis aus. Bei rsync ist es wichtig, keinen abschließenden Schrägstrich in das Verzeichnis (imbigdir
Vergleich zubigdir/
) einzufügen. Andernfalls geht rsync davon aus, dass Sie das Äquivalent zu denbigdir/*
meisten anderen Tools gemeint haben.Der Task-Spooler gibt die Eingabeaufforderung zurück und lässt Sie viele dieser Befehle nacheinander in die Warteschlange stellen. Überprüfen Sie die Ausführungswarteschlange mit
ts
ohne Argumente.Der Task-Spooler verfügt über zahlreiche Funktionen, z. B. das Neuanordnen der Ausführungswarteschlange, das Ausführen eines bestimmten Jobs nur, wenn ein anderer Job erfolgreich ausgeführt wurde usw. Lesen Sie die Hilfe zu
ts -h
. Manchmal überprüfe ich die Befehlsausgabe, während sie ausgeführt wirdts -c
.Es gibt andere Methoden, um dies zu tun, aber für Ihren Anwendungsfall enthalten sie alle Task-Spooler. Ich entscheide mich für die Verwendung von rsync over SSH, um Datei-Zeitstempel beizubehalten, die beim Kopieren über SMB nicht möglich wären.
quelle
ts
, scheinen sehr leistungsfähig und einfach zu bedienen, einfach gegabelt auf Github autotoolized und debianisierten.task-spooler
:-) ... jedenfalls ist das in deinem Kommentar ein sehr guter Vorschlag, den ich sehr bald machen werde.Ich brauche sowas auch ziemlich oft. Ich habe ein kleines Hilfsprogramm geschrieben
after
, das einen Befehl ausführt, wenn ein anderer Prozess beendet ist. Es sieht aus wie das:Sie führen es dann so aus:
Dies hat gegenüber einigen anderen Ansätzen den großen Vorteil, dass der erste Job nicht auf besondere Weise ausgeführt werden muss. Sie können jeden Prozess mit Ihrem neuen Job verfolgen.
quelle
Befehl1 && Befehl2
quelle
Sie können einfach Befehle zur Befehlszeile der Shell hinzufügen, die bereits einen Befehl ausführt.
Entweder sorgfältig tippen oder anderswo tippen, überprüfen und ausschneiden und einfügen. Selbst wenn der aktuelle Befehl Ausgabezeilen spuckt, können Sie immer noch etwas Neues eingeben, die Eingabetaste drücken und es wird ausgeführt, wenn alle Befehle ausgeführt oder eingegeben wurden, bevor es abgeschlossen ist.
Beispiel folgt. Sie können das Ganze ausschneiden und einfügen oder die nachfolgenden Befehle eingeben, während der erste ausgeführt wird (wenn Sie wirklich sehr schnell tippen), oder wahrscheinlicher, während der zweite ausgeführt wird:
quelle
Der hackigste Weg, den ich mir vorstellen kann, ist es, den Warteschlangenstatus mit einfachen Sperrdateien in / tmp beizubehalten. Wenn file1.sh seine cp-Befehle ausführt, behält es eine Sperrdatei (oder einen Hardlink) in / tmp bei. Wenn es fertig ist, löschen Sie die Datei. Jedes andere Skript muss in / tmp nach Sperrdateien mit dem von Ihnen gewählten Benennungsschema suchen. Natürlich ist dies mit allen Arten von Fehlern behaftet, aber es ist trivial einzurichten und kann vollständig innerhalb von Bash durchgeführt werden.
quelle