Ich arbeite auf einem Linux-Computer über SSH (Putty). Ich muss einen Prozess nachts laufen lassen, also dachte ich, ich könnte das tun, indem ich den Prozess im Hintergrund starte (mit einem kaufmännischen Und am Ende des Befehls) und stdout in eine Datei umleitet.
Zu meiner Überraschung funktioniert das nicht. Sobald ich das Putty-Fenster schließe, wird der Vorgang gestoppt.
Wie kann ich das verhindern?
linux
process
ssh
background-process
GetFree
quelle
quelle
nohup command > /dev/null 2>&1 &
, um im Hintergrund auszuführen, ohne eine stdout- oder stderr-Ausgabe (keinenohup.out
Datei) zu erstellennohup
hilft in diesem Fall nicht. Gibt es eine Möglichkeit, mitCtrl+Z
/ zu fummelnbg
?Ich würde die Verwendung von GNU Screen empfehlen . Sie können die Verbindung zum Server trennen, während alle Ihre Prozesse weiterhin ausgeführt werden. Ich weiß nicht, wie ich ohne es gelebt habe, bevor ich wusste, dass es existiert.
quelle
Wenn die Sitzung geschlossen ist, empfängt der Prozess das SIGHUP-Signal, das er anscheinend nicht abfängt. Sie können den
nohup
Befehl beim Starten des Prozesses oder den integrierten Befehl bashdisown -h
nach dem Starten des Prozesses verwenden, um dies zu verhindern:quelle
dämonisieren? nein? BILDSCHIRM? (tmux ftw, Bildschirm ist Junk ;-)
Tun Sie einfach das, was jede andere App von Anfang an getan hat - Double Fork.
Knall! Fertig :-) Ich habe dies unzählige Male auf allen Arten von Apps und vielen alten Maschinen verwendet. Sie können mit Weiterleitungen und so weiter kombinieren, um einen privaten Kanal zwischen Ihnen und dem Prozess zu öffnen.
Als coproc.sh erstellen:
und dann
Und los geht's, laiche was auch immer. Das <(:) öffnet eine anonyme Pipe durch Prozessersetzung, die stirbt, aber die Pipe bleibt bestehen, weil Sie ein Handle dafür haben. Normalerweise mache ich ein
sleep 1
statt,:
weil es etwas rassig ist und ich einen "Datei beschäftigt" -Fehler bekomme - passiert nie, wenn ein echter Befehl ausgeführt wird (z. B.command true
)"Heredoc Sourcing":
Dies funktioniert auf jeder einzelnen Shell, die ich jemals ausprobiert habe, einschließlich Busybox / etc (initramfs). Ich habe es noch nie zuvor gesehen, ich habe es unabhängig entdeckt, als ich stupste. Wer wusste, dass die Quelle Argumente akzeptieren kann? Aber es dient oft als viel besser handhabbare Form der Bewertung, wenn es so etwas gibt.
quelle
ssh myhost "((exec sleep 500)&) >/dev/null"
ssh myhost 'sleep 500 >&- 2>&- <&- &'
TMTOWTDI;)Ersetzen Sie bla durch Ihren Prozessnamen!
quelle
Persönlich mag ich den Befehl 'Batch'.
Dadurch wird es in den Hintergrund gestellt und die Ergebnisse per E-Mail an Sie gesendet. Es ist ein Teil von Cron.
quelle
Wie andere angemerkt haben, muss sich der Hintergrundprozess ordnungsgemäß von seinem steuernden Terminal trennen, um einen Prozess im Hintergrund auszuführen, damit Sie die Verbindung zu Ihrer SSH-Sitzung trennen können. Dies ist die Pseudo-Tty, die die SSH-Sitzung verwendet.
Informationen zu Dämonisierungsprozessen finden Sie in Büchern wie Stevens '"Advanced Network Program, Vol 1, 3rd Edn" oder Rochkinds "Advanced Unix Programming".
Ich musste mich kürzlich (in den letzten Jahren) mit einem widerspenstigen Programm befassen, das sich nicht richtig dämonisierte. Am Ende habe ich mich damit befasst, indem ich ein generisches Dämonisierungsprogramm erstellt habe - ähnlich wie bei nohup, aber mit mehr verfügbaren Steuerelementen.
Der Doppelstrich ist auf Systemen optional, die die GNU-Funktion getopt () nicht verwenden. Es ist unter Linux usw. erforderlich (oder Sie müssen POSIXLY_CORRECT in der Umgebung angeben). Da Double-Dash überall funktioniert, ist es am besten, es zu verwenden.
Sie können mich weiterhin kontaktieren (Vorname und Nachname bei gmail dot com), wenn Sie die Quelle für möchten
daemonize
.Der Code ist jedoch jetzt (endlich) auf GitHub in meinem SOQ- Repository (Stack Overflow Questions) als Datei
daemonize-1.10.tgz
im Unterverzeichnis der Pakete verfügbar .quelle
Auf einem Debian-basierten System (auf dem Remote-Computer) Installieren Sie:
Verwendungszweck:
So benennen Sie die Sitzung um:
So beenden Sie die Sitzung:
(Dies verlässt die tmux-Sitzung). Anschließend können Sie sich von SSH abmelden.
Wenn Sie zurückkommen / es erneut überprüfen müssen, starten Sie SSH und geben Sie ein
Sie kehren zu Ihrer tmux-Sitzung zurück.
quelle
Für die meisten Prozesse können Sie mit diesem alten Linux-Befehlszeilentrick eine Pseudo-Dämonisierung durchführen:
Beispielsweise:
Starten Sie dann ein neues Terminalfenster und:
Wird zeigen, dass
sleep 30
noch läuft.Was Sie getan haben, ist, den Prozess als Kind eines Kindes
nohup
zu starten , und wenn Sie beenden, wird der Befehl, der normalerweise den Prozess zum Beenden auslösen würde, nicht auf das Enkelkind übertragen, sodass er als verwaister Prozess verbleibt und noch ausgeführt wird .Ich ziehe dieses „gesetzt und vergessen“ -Ansatz, keine Notwendigkeit zu behandeln
nohup
,screen
, tmux, I / O - Umleitung oder irgendwelchen von diesem Zeug.quelle
Wenn Sie den Bildschirm verwenden, um einen Prozess als Root auszuführen, achten Sie auf die Möglichkeit von Angriffen zur Erhöhung von Berechtigungen. Wenn Ihr eigenes Konto irgendwie kompromittiert wird, gibt es eine direkte Möglichkeit, den gesamten Server zu übernehmen.
Wenn dieser Prozess regelmäßig ausgeführt werden muss und Sie über ausreichenden Zugriff auf den Server verfügen, ist es besser, cron zum Ausführen des Jobs zu verwenden. Sie können auch init.d (den Super-Daemon) verwenden, um Ihren Prozess im Hintergrund zu starten, und er kann beendet werden, sobald er fertig ist.
quelle
nohup
ist sehr gut, wenn Sie Ihre Daten in einer Datei protokollieren möchten. Aber wenn es um den Hintergrund geht, können Sie ihm kein Passwort geben, wenn Ihre Skripte danach fragen. Ich denke du musst es versuchenscreen
. Es ist ein Dienstprogramm, das Sie mit yum beispielsweise unter CentOS auf Ihrer Linux-Distribution installieren undyum install screen
dann über Putty oder eine andere Software in Ihrem Shell-Typ auf Ihren Server zugreifen könnenscreen
. Es öffnet Bildschirm [0] in Kitt. Tun Sie Ihre Arbeit. Sie können in derselben Kitt-Sitzung mehr Bildschirm [1], Bildschirm [2] usw. erstellen.Grundlegende Befehle, die Sie kennen müssen:
Bildschirm starten
Bildschirm
Um c reate nächsten Bildschirm
Strg + a + c
Um zum n ext Bildschirm erstellt Ihnen
Strg + a + n
Um d Etach
Strg + a + d
Während der Arbeit schließen Sie Ihren Kitt. Und das nächste Mal, wenn Sie sich per Kitt anmelden
Bildschirm -r
Um die Verbindung zu Ihrem Bildschirm wiederherzustellen, können Sie sehen, dass Ihr Prozess noch auf dem Bildschirm ausgeführt wird. Und um den Bildschirm zu verlassen, geben Sie #exit ein.
Weitere Details finden Sie unter
man screen
.quelle
yum
das richtige Werkzeug ist, wenn Sie die Distribution nicht kennen, ist nicht gut. Sie sollten klarstellen, auf welchen Distributionenscreen
installiert werden kannyum
.Mit Nohup kann ein Client-Prozess nicht beendet werden, wenn der übergeordnete Prozess beendet wird. Dies ist ein Argument, wenn Sie sich abmelden. Noch besser noch verwenden:
Nohup macht den Prozess, den Sie starten, immun gegen die Beendigung, die Ihre SSH-Sitzung und ihre untergeordneten Prozesse beim Abmelden beenden. Der Befehl, den ich gegeben habe, bietet Ihnen eine Möglichkeit, die PID der Anwendung in einer PID-Datei zu speichern, damit Sie sie später korrekt beenden und den Prozess ausführen können, nachdem Sie sich abgemeldet haben.
quelle
Bildschirm verwenden. Es ist sehr einfach zu bedienen und funktioniert wie vnc für Terminals. http://www.bangmoney.org/presentations/screen.html
quelle
Wenn Sie bereit sind, auch X-Anwendungen auszuführen, verwenden Sie xpra zusammen mit "screen".
quelle
Ich würde auch für Bildschirmprogramm gehen (ich weiß, dass eine andere Antwort Bildschirm war, aber dies ist eine Vervollständigung)
Nicht nur die Tatsache, dass &, Strg + Z bg Verleugnung, Nohup usw. Sie möglicherweise böse überraschen, dass der Job beim Abmelden immer noch beendet wird (ich weiß nicht warum, aber es ist mir passiert, und es hat mich nicht gestört Das liegt daran, dass ich auf Bildschirm umgestellt habe, aber ich denke, Anthonyrisinger-Lösung als Doppelgabelung würde das lösen.) Auch Bildschirm hat einen großen Vorteil gegenüber nur Hintergrund:
und übrigens, das ist eine Frage, die ich niemals stellen würde :) ... ich benutze den Bildschirm von Anfang an, um irgendetwas in einem Unix zu tun ... Ich arbeite (fast) NIE in einer Unix / Linux-Shell ohne Startbildschirm zuerst ... und ich sollte jetzt aufhören, oder ich beginne eine endlose Präsentation darüber, was ein guter Bildschirm ist und was für dich tun kann ... schau selbst nach, es lohnt sich;)
quelle
&
(asynchrone Ausführung) 1971 von der Thompson-Shell für die erste Version von UNIX eingeführt ... also war es buchstäblich "immer" ;-) leider, Ich war zu konservativ - es sind tatsächlich 41 Jahre vergangen.Es gibt auch den Daemon- Befehl des Open-Source-Pakets libslack.
daemon
ist ziemlich konfigurierbar und kümmert sich um all die mühsamen Daemon-Dinge wie automatischen Neustart, Protokollierung oder Pidfile-Behandlung.quelle
Fügen Sie diese Zeichenfolge an Ihren Befehl an:> & - 2> & - <& - &. > & - bedeutet stdout schließen. 2> & - bedeutet stderr schließen. <& - bedeutet nahe stdin. & bedeutet im Hintergrund laufen. Dies funktioniert auch, um einen Job programmgesteuert über ssh zu starten:
quelle
Ich habe den Bildschirmbefehl verwendet. Dieser Link enthält detaillierte Informationen dazu
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
quelle
Akzeptierte Antwort schlägt vor, nohup zu verwenden . Ich würde eher die Verwendung von pm2 vorschlagen . Die Verwendung von pm2 über nohup bietet viele Vorteile, z. B. das Aufrechterhalten der Anwendung, das Verwalten von Protokolldateien für die Anwendung und viele weitere Funktionen. Weitere Informationen finden Sie hier .
Um pm2 zu installieren, müssen Sie npm herunterladen . Für Debian-basiertes System
und für Redhat
Oder Sie können diesen Anweisungen folgen . Nach der Installation von npm verwenden Sie es, um pm2 zu installieren
Sobald dies erledigt ist, können Sie Ihre Bewerbung durch starten
Verwenden Sie zur Prozessüberwachung die folgenden Befehle:
Verwalten Sie Prozesse entweder mit dem App-Namen oder der Prozess-ID oder verwalten Sie alle Prozesse zusammen:
Protokolldateien finden Sie in
Binäre ausführbare Dateien können auch mit pm2 ausgeführt werden. Sie müssen eine Änderung in der Jason-Datei vornehmen. Ändern Sie das
"exec_interpreter" : "node"
in"exec_interpreter" : "none".
(siehe Abschnitt Attribute ).Kompilieren des obigen Codes
und führen Sie es mit np2 im Hintergrund aus
quelle
Unter systemd / Linux ist systemd-run ein nützliches Tool, um sitzungsunabhängige Prozesse zu starten. Hasser werden hassen
quelle