Probleme beim Durchlaufen einer Reihe von SSH-Befehlen

1646
JMzance

Ich habe eine Reihe von Servermaschinen, auf denen ich denselben Befehl ausführen möchte. Jeder Befehl dauert Stunden und (obwohl ich die Befehle mit nohup und der Einstellung für den Hintergrund im Hintergrund ausführe), muss ich warten, bis jeder Befehl fertig ist, bevor der nächste Befehl startet. Ich habe es ungefähr so ​​eingestellt:

Auf den Host-Maschinen:

for i in ; do ssh RemoteMachine$ ./RunJobs.sh; done 

Wo sich RunJobs.sh auf jedem Remote-Computer befindet:

 source ~/.bash_profile cd AriadneMatching for file in FileDirectory/Input_*; do nohup ./Executable $ & done exit 

Kennt jemand einen Weg, auf dem ich nicht warten muss, bis der Job fertig ist, bevor der nächste Job startet? Oder als Alternative dazu: Ich habe das Gefühl, dass das, was ich tue, ziemlich suboptimal ist. Prost, Jack

1
Vielleicht versuchen Sie es irgendwo mit einem Et-Zeichen. http://superuser.com/questions/177218/how-to-start-gui-linux-programs-von-the-command-line-but-separate-von-the-com- Begriff könnte Hintergrundprozess sein Einige weitere Ideen, die relevant sein könnten http://stackoverflow.com/questions/29142/getting-ssh-to-execute-a-command-in-the-background-on-target-machine barlop vor 11 Jahren 0
Ich habe das bereits mit den eigentlichen Jobausführungen, aber Sie meinen, vielleicht brauchen die Zeilen './RunJobs.sh' auch ein kaufmännisches Und? JMzance vor 11 Jahren 0
Ich bin darüber sehr ahnungslos und habe nicht bemerkt, dass Sie das kaufmännische Und-Zeichen bereits getan haben. barlop vor 11 Jahren 0
`für i in ; do nohup ssh RemoteMachine $ ./RunJobs.sh& done`. Es ist nicht sehr robust, aber es ist schnell und schmutzig, wenn es für Sie funktioniert. Blacklight Shining vor 11 Jahren 0

4 Antworten auf die Frage

2
nitro2k01

Zum einen kann man sich mit aussehen wollen, screenanstatt nohupfür die Herstellung der Sitzung überleben eine Trennung. screengibt Ihnen ein virtuelles Terminal, zu dem Sie später zurückkehren können. Die grundlegende Verwendung besteht screen yourcommanddarin, eine bestehende Sitzung auszuführen yourcommandund screen -DRautomatisch eine Verbindung herzustellen oder eine neue zu erstellen, falls keine vorhanden ist. Wenn Sie den Bildschirm ohne Argument ausführen, erhalten Sie auch eine Eingabeaufforderung in einem "Bildschirm", den Sie verwenden können.

Zweitens möchten Sie vielleicht in GNU Parallel nach parallelen Jobs suchen . Möglicherweise möchten Sie nicht mehr Prozesse ausführen, als CPU-Kerne vorhanden sind, da sich die Renditen verringern und die Festplatte überlastet wird. Ein geeigneter Befehl für Sie könnte der folgende sein, den Sie wiederum innerhalb eines Bildschirms ausführen müssten, damit eine Verbindung getrennt werden kann.

ls FileDirectory/Input_* | parallel -j 8 --workdir $PWD ./Executable {}

Die Dateien, die Sie parallelbearbeiten möchten, werden aufgelistet und weitergeleitet, in denen Sie 8 parallele Jobs ausführen und im aktuellen Verzeichnis arbeiten müssen.

Da screen die Pipes und andere Dinge in den als Argument angegebenen Befehlen nicht versteht - das ist die Aufgabe der Shell -, müssen Sie entweder den Befehl in ein Shell-Skript schreiben oder den Befehl sh -c angeben, um den Befehl auszuführen.

screen sh -c 'ls FileDirectory/Input_* | parallel -j 8 --workdir $PWD ./Executable {}'

oder einfach

screen ./runjob

wo runjobenthält:

#!/usr/bin/env bash ls FileDirectory/Input_* | parallel -j 8 --workdir $PWD ./Executable {} 
Danke, aber parallel ist auf keinem der Rechner installiert (und ich habe keine Sudo-Rechte!) JMzance vor 11 Jahren 0
Kleiner Vorschlag: `find FileDirectory -name 'Input_ *' -print0 | -0 -j 8 --workdir $ PWD ./Executable {} `wäre etwas sicherer als das` ls`. Cristian Ciupitu vor 11 Jahren 0
@JackMedley Bitte erläutern Sie, ob Ihre Begründung nicht durch http://oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html abgedeckt ist Ole Tange vor 11 Jahren 1
1
MariusMatutiae

Verwenden Sie den Bildschirm auf jeder Maschine. screen startet einen Befehl (in der Regel eine Shell), der von Ihrer ssh-Sitzung getrennt werden kann, sodass der Job, der gerade gestartet wurde, weiterhin ausgeführt wird. Mit anderen Worten, der Job wird, obwohl er noch läuft, nicht durch Interrupts unterbrochen (nicht nur kill -9), wenn Sie sich abmelden.

Wenn Sie möchten, können Sie die Verbindung über SSH wiederherstellen und über den Befehl der getrennten Sitzung wieder beitreten

screen -r 

und dies bringt Sie nahtlos zurück in die Shell, die Sie aufgegeben haben, und zeigt Ihnen alle Standardausgaben an, die Sie in der Zwischenzeit vermisst haben.

Auf diese Weise müssen Sie weder auf etwas warten, noch haben Sie gefährliche SSH-Sitzungen, die bei versehentlichem Abbruch Ihre Jobs zerstören würden.

Bildschirm ist in den Repos.

0
Cristian Ciupitu

Lösung für den lokalen Rechner

Basierend auf parallel-ssh

# pssh -P --par 2 --hosts RemoteMachines /opt/RunJobs.sh 

oder:

# pssh -i --par 2 --hosts RemoteMachines /opt/RunJobs.sh 

Erläuterung der Parameter:

-P --print Display output as it arrives. This option is of limited usefulness because output from different hosts are interleaved.  -i --inline Display standard output and standard error as each host completes.  -p parallelism --par parallelism Use the given number as the maximum number of concurrent connections.  -h host_file --hosts host_file Read hosts from the given host_file. 

Basierend auf Ansible

# ansible --forks 2 -i RemoteMachines '*' -m command -a /opt/RunJobs.sh 

Erläuterung der Parameter:

-f NUM, --forks=NUM Level of parallelism. NUM is specified as an integer, the default is 5.  -i PATH, --inventory=PATH The PATH to the inventory hosts file, which defaults to /etc/ansible/hosts.  -m NAME, --module-name=NAME Execute the module called NAME.  -a 'ARGUMENTS', --args='ARGUMENTS' The ARGUMENTS to pass to the module. 

Das Befehlsmodul führt die Befehlsnamen durch eine Liste von Leerzeichen getrennten Argumenten folgen. Der angegebene Befehl wird auf allen ausgewählten Knoten ausgeführt. Es wird nicht durch die Shell verarbeitet, daher funktionieren Variablen wie $ HOME und Operationen wie "<", ">", "|" und "&" nicht.

Weitere Informationen finden Sie unter Einführung in Ad-hoc-Befehle .

Anmerkung: Ansible wechselt nicht zur nächsten Gruppe von Hosts, bis alle aktuellen Hosts ("Gabeln") fertig sind. Daher ist die Parallelität geringer als bei pssh (möglicherweise besteht eine Möglichkeit, sie zu erhöhen, aber ich weiß es nicht). .

Die RemoteMachines- Datei sieht in beiden Fällen in etwa so aus:

root@maria-clone1.skynet.tld root@maria-clone2.skynet.tld root@maria-clone3.skynet.tld root@maria-clone4.skynet.tld 

Lösung für die entfernten Maschinen

Rewrite RunJobs.sh in etwa so aus :

find FileDirectory -name 'Input_*' -print0 | xargs -0 -P 2 -n 1 ./Executable 

Erklärung :

-0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.  -P max-procs, --max-procs=max-procs Run up to max-procs processes at a time; the default is 1. If max-procs is 0, xargs will run as many processes as possible at a time. Use the -n option or the -L option with -P; otherwise chances are that only one exec will be done.  -n max-args, --max-args=max-args Use at most max-args arguments per command line. Fewer than max-args arguments will be used if the size (see the -s option) is exceeded, unless the -x option is given, in which case xargs will exit. 

nitro2k01 ‚s Lösung auf Basis GNU Parallel ist mächtiger, aber wie Sie sehen können, GNU xargs ist auch nicht schlecht.

0
Cwissy

für i in ; do ssh RemoteMachine $ ./RunJobs.sh; erledigt

Versuche dies

for i in ; do echo RemoteMachine$; done |xargs -I % -n 1 -P 10 ssh % "./RunJobs.sh" 

Sie erstellen eine Liste mit Computernamen und leitet die gesamte Liste an xargs weiter. Die Argumente für xargs bedeuten:

-I% ersetzt das Vorkommen von% durch das erste Argument

-n 1 Verwenden Sie 1 Argument pro Befehlszeile

-P 10 führt jeweils 10 Prozesse aus