bash - mehrere befehle von der bash entkoppeln mit & disown

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.543
Hi,

kann ich mehrere Befehle auf einer Zeile gemeinsam entkoppeln? Zum Verständnis ein Beispiel

Code:
while [ $(ps -12345 | wc -l) -ge 2 ]; do sleep 1; done; cp -r QUELLE ZIEL & disown

Sobald der Kopiervorgang mit pid 12345 abgeschlossen ist, soll der nächste gestartet werden, ich will aber meinen Rechner (der über ssh zugreift) schon ausschalten. So wird aber nur der Kopiervorgang in den Hintergrund geschoben. Musss ich hinter jeden Vorgang extra & disown setzen?

Vielen Dank
 
Du kannst auch mit dem Kommando "screen" eine Session eröffnen, die nach dem Trennen der Verbindung weiter ihre arbeitet verrichtet.
Trennen bedeutet in diesem Fall den SSH-Client via Taskmanager abschießen.

Was möchtest du außerdem genau machen? Vielleicht hilft ein Cronjob oder so.
 
Hancock schrieb:
Code:
sh -c "..." & disown
​
?

​EDIT: Das macht, dass es sequenziell abläuft, machst du hinter jeden Befehl ein &, spawnst du viele gleichzeitige Prozesse, was mglw. nicht das ist, was du willst.

Gibts den Parameter auf für die Bash?

Hintergrund ist: Ich kopiere häufiger größere Datenmengen, manchmal möchte ich einen zweiten Kopiervorgang starten, damit Die Festplatte aber nicht immer hin und her wechseln muss (ich bilde mir auch ein, die Fragmentierung wäre größer wenn man mehrere Sachen gleichzeitig kopiert) möchte ich gern, dass der zweite Befehl erst gestartet wird, wenn der erste beendet wurde. Das ich einen zweiten Kopiervorgang starten möchte, fällt mir manchmal aber erst auf, wenn der erste schon längst im Hintergrund läuft.

screen wäre eine Möglichkeit. Da ich screen allerdings noch nie richtig benutzt habe, wäre ein bischen Einarbeitung notwendig. Außerdem habe ich immer Angst, screen-sessions zu vergessen, die dann im Hintergrund ewig Resourcen verbrauchen, bis ich sie vlt. mit ps mal wieder entdecke.
 
Wenn du noch kein screen genutzt hast, nimm gleich tmux. Das ist etwas freundlicher in der Bedienung.

Das Vergessen von Sessions sollte kein Problem sein, zum einen können bestehende Sessions aufgelistet werden (read the F* manpage ;) ) oder aber die faule Variante, man wirft in die .bashrc ein Snippet hinein, welches eine tmux session startet wenn man mit ssh auf die Ḱiste geht bzw. wenn bereits eine entsprechende tmus session besteht in diese hineingesprungen werden kann:

Code:
# Tmux attach to running session or create new one if none is found
if [[ -z "$TMUX" ]] && [ "$SSH_CONNECTION" != "" ]; then
    tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
fi

Zu deinen Kopierorgien, paralleles Kopieren sollte nicht zu Defragmentation führen. Zumindest nicht solang bekannt ist, wie groß die zu schreibende Datei ist. Bei cp sollte das typischerweise der Fall sein. Für größere Jobs würde ich sowieso rsync empfehlen und da dann das Setzen von --prealloc.
Wenn dir häufiger einfällt, dass du noch weiteren Kram kopieren willst solltest du vielleicht anfangen dir ein script zu schreiben und auf dieses ein alias zeigen zu lassen. Das Script könnte dann einen Ordner / eine Datei durchsuchen. Dort Quelle und Ziel herauslesen, den Kopievorgang entsprechend durchführen, den entsprechenden Eintrag löschen (oder als erledigt markieren) und nach einem weiteren Eintrag suchen.
 
Zuletzt bearbeitet:
Code:
bash -c "..." & disown

Oder schau dir mal byobu an, ist eine Abstraktion über screen / tmux.
 
Zurück
Oben