Wie kann man ein Skript lesen, um die Benutzereingaben zu lesen, dann im Hintergrund laufen und das Terminal in TCSH schließen?

419
Scout

Ich suche einen Strategievorschlag. Linux Shell Scripting ist sehr neu. Ich lernte tcsh nicht länger als einen Monat. Ich brauche ein Skript, um automatisch zu erkennen, wann die Ergebnisdateien von einem Remote-Server in einen Ordner auf einem Remote-Computer zurückkopiert werden. Starten Sie dann die Dateien wieder auf meiner Workstation. Ich weiß nicht im Voraus, wann der Job abgeschlossen ist, daher könnte der Ordner für längere Zeit keine Ergebnisdateien enthalten. Ich weiß auch nicht, wann die letzte Ergebnisdatei vom Remote-Server in den Ordner zurückkopiert wird (und damit der SCP gestartet werden kann).

Ich hatte Crontab ausprobiert. Funktioniere gut, wenn ich richtig schätze, meistens nur enttäuschend. Also habe ich versucht, selbst ein Skript zu schreiben, und ich habe es jetzt. Ich habe vor, ein Drehbuch zu produzieren, das auch mir und meinen Kollegen dient. Um das Skript verwenden zu können, muss sich der Benutzer zunächst manuell bei der Remote-Maschine anmelden. Führen Sie das Skript dann nur auf einem entfernten Rechner aus. Das Skript fordert den Benutzer zunächst auf, den Namen und das Verzeichnis der lokalen Maschine einzugeben, in das die Ergebnisdateien gespeichert werden sollen. Dann wird das Skript nur wiederholt, um zu testen, wann sich die Gesamtzahl der Dateien ändert. Wenn festgestellt wird, dass die erste Ergebnisdatei vom Remoteserver zurückkopiert wird, wird erneut eine Schleife durchlaufen, um zu ermitteln, wann die Gesamtdateigröße im Ordner aufhört, sich zu ändern, was bedeutet, dass die letzte Ergebnisdatei vollständig in den Server kopiert wurde Mappe.

Das Skript funktioniert einwandfrei, aber ich möchte, dass das Skript im Hintergrund ausgeführt werden kann und immer noch von selbst ausgeführt wird, auch wenn der Benutzer sich von der Remote-Maschine abmeldet und das Terminal schließt. Und ich möchte auch, dass der Benutzer einen einfachen Befehl in das Terminal eingibt, um das Skript zu starten, ähnlich wie ein einfacher Befehl

./script.tcsh

Ich habe versucht, das Skript per Befehl auszuführen

./script.tcsh &

schlägt jedoch fehl, da der Hintergrundprozess keine Benutzereingaben akzeptieren kann.

Google und etwas gefunden, das als disown bezeichnet wird, aber der Befehl wurde nicht gefunden. Anscheinend unterstützen der Remote-Computer und mein Computer diesen Befehl nicht.

Es wurde versucht, das Skript so zu ändern, dass es zuerst die Benutzereingabe akzeptiert und dann versucht, es zu verwenden

cat > temp_script.tcsh << EOF  EOF 

und dann eine Zeile von

./temp_script.tcsh & 

um zu versuchen, eine andere Skriptdatei zu erstellen und das zweite Skript mit dem ersten Skript im Hintergrund zu initiieren. Auch scheitern, da cat $ variable nicht als wörtlichen Text behandelt, sondern durch Werte ersetzt. Ich habe eine foreach i (1 2) -Schleife und der cat-Befehl meldet einfach den Fehler (fehlender Wert der Variablen i, der nur ein Zähler in der foreach-Schleifensyntax ist).

Ich habe momentan keine Ahnung. Kann mich jemand mit einer Strategie aufklären, die ich selbst ausprobieren kann? Das Ziel ist, nur eine Skriptdatei zu verwenden und den Benutzer zur Eingabe von 2 Eingaben aufzufordern (Computername und Verzeichnis zum Speichern), dann keine Interaktion mit dem Benutzer oder Warten mehr, und das Terminal kann sogar geschlossen werden.

Hinweis: Ich benötige kein Passwort, um sich an einem entfernten Computer anzumelden und zurück.

0
Ist es in Ordnung, rsync zu verwenden? In diesem Fall könnte ein Crontab-Job alle n Minuten ausgeführt werden. Es werden unvollständige Dateien kopiert, das Endergebnis wird jedoch endgültig sauber sein. Hier ist ein Skript, das sicherstellt, dass nur ein rsync ausgeführt wird: https://superuser.com/questions/847850/behavior-of-rsync-with-file-thats-still-being-written?s=1|54.5125 Louis vor 6 Jahren 1
Danke für die Antwort. Ich kann rsync in der Remote-Maschine verwenden. Aufgrund der Geschwindigkeitsbeschränkung für die Internetverbindung neige ich jedoch dazu, zuerst alle erforderlichen Dateien zu komprimieren (mit dem Befehl tar), bevor Sie scp starten. Aus Erfahrung macht es einen Unterschied, da viele Dateien große ASCII-Dateien sind und daher sehr komprimierbar sind. Scout vor 6 Jahren 0
Ein weiteres Problem ist, dass einige meiner Kollegen in Linux nicht genau fließend sind. Also versuche ich es so wenig wie möglich zu machen. Ich denke, ich kann ein Skript erstellen, um eine Crontab zu erstellen, die rsync verwendet. Wenn ich die Idee jedoch richtig verstanden habe, muss der Benutzer die Crontab noch manuell löschen, wenn sie fertig ist. Andernfalls läuft sie auf dem Remote-Computer weiter (obwohl sie kopiert wird) nichts). Dieser Schritt, bei dem der Benutzer das Crontab manuell löschen muss, führt dazu, dass ich bei dieser Methode weniger Neigung habe. Ich möchte, dass der Benutzer das Skript ausführt, und hört dann für immer auf, sich darüber Sorgen zu machen. Scout vor 6 Jahren 0
Trotzdem mag ich Rsync sehr gerne. Ich wünschte, ich würde diesen Befehl früher entdecken. Scout vor 6 Jahren 0
Ja, Crontab muss manuell gestoppt werden. Vielleicht könnten Sie das Skript intelligent ausführen und nach einem bestimmten Punkt nichts tun. Aber für Crontab glaube ich, dass es so einfach ist wie der Benutzer, der `crontab -e` eingibt und dann ein '#' (Pound-Zeichen) vor dem rsync-Job setzt, um es zu kommentieren, oder das` # `entfernt, um es erneut in die scheulde einzufügen. Die Komprimierung in rsync wird mit dem `z`-Flag aktiviert. Es ist wahrscheinlich langsamer, verbraucht aber weniger Bandbreite. In Linux ist die gute / gruselige Sache, wenn Sie Sudo können, dann können Sie Sudo in die Crontab Ihres Kollegen. So konnten Sie immer Dinge für sie reparieren, wenn sie verloren gingen. Louis vor 6 Jahren 0
Ich muss testen, ob ich den `sudo`-Befehl verwenden kann. Zum ersten Mal habe ich davon gehört. Auf der anderen Seite habe ich gerade entdeckt, dass "Katze" so gemacht werden kann, dass sie buchstäblich gedruckt wird, ohne die Variable zu ersetzen. Alles, was ich brauche, ist ein doppeltes Anführungszeichen. Was ich damit meine, ist `cat> temp_script.tcsh <<" EOF "` Wenn dies so funktioniert, wie ich mir vorstelle, könnte ich mein Problem lösen. Ich denke, mein mögliches Problem könnte sein, wie man das zweite Skript in die Lage versetzt, den Wert der Benutzereingabevariable zu verwenden, der vom ersten Skript gespeichert wird. Ich werde es im Amt noch einmal versuchen müssen. Scout vor 6 Jahren 0
Ich schlage vor, dass Sie einen Benutzer nicht über cron zur Eingabe derartiger Eingaben auffordern. Ich denke, ich würde es wirklich nervig und möglicherweise gefährlich machen, wenn ich etwas gab, das etwas Unerwartetes tat. Ich schlage vor, etwas anderes zu machen oder sie nur einmal zu fragen. Louis vor 6 Jahren 0
Das `cat> temp_script.tcsh <<" EOF "` funktioniert so, wie ich es mir vorgestellt hatte, und ich bekam mein Skript endlich wie vorgesehen. Vielen Dank Louis für Ihr bisheriges Feedback. Sie sind der einzige, der mich unterhalten möchte. Scout vor 6 Jahren 0

0 Antworten auf die Frage