So verhindern Sie unter Linux, dass ein Hintergrundprozess nach dem Schließen des SSH-Clients gestoppt wird

StackOverflow https://stackoverflow.com/questions/285015

Frage

Ich arbeite auf einem Linux-Rechner ü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 umleite.Zu meiner Überraschung funktioniert das nicht.Sobald ich das Putty-Fenster schließe, wird der Vorgang gestoppt.

Wie kann ich das verhindern??

War es hilfreich?

Lösung

Schauen Sie sich die " nohup " Programm.

Andere Tipps

würde ich empfehlen die Verwendung von GNU Screen-. Es ermöglicht Ihnen, vom Server zu trennen, während alle Ihre Prozesse weiter laufen. Ich weiß nicht, wie ich ohne sie gelebt, bevor ich wusste, dass es existierte.

Wenn die Sitzung des Prozesses geschlossen wird, erhält das SIGHUP Signal, das es offenbar nicht zu kontrollieren. Sie können die nohup Befehl verwenden, wenn der Prozess oder die bash integrierten Befehl disown -h startet nach dem Start des Prozesses dies zu verhindern:

> help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

daemonize? nohup? BILDSCHIRM? (Tmux ftw, Bildschirm ist Junk; -)

Genau das tun, was jeder andere App seit Anfang getan hat -. Doppelgabel

# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid:   1
# jobs
# disown
bash: disown: current: no such job

Bang! Geschehen :-) ich diese unzählige Male auf allen Arten von Anwendungen und viele alte Maschinen verwendet haben. Sie können mit Umleitungen kombinieren und so weiter über einen privaten Kanal zwischen Ihnen zu öffnen und dem Prozess.

Erstellen Sie als coproc.sh:

#!/bin/bash

IFS=

run_in_coproc () {
    echo "coproc[$1] -> main"
    read -r; echo $REPLY
}

# dynamic-coprocess-generator. nice.
_coproc () {
    local i o e n=${1//[^A-Za-z0-9_]}; shift
    exec {i}<> <(:) {o}<> >(:) {e}<> >(:)
. /dev/stdin <<COPROC "${@}"
    (("\$@")&) <&$i >&$o 2>&$e
    $n=( $o $i $e )
COPROC
}

# pi-rads-of-awesome?
for x in {0..5}; do
    _coproc COPROC$x run_in_coproc $x
    declare -p COPROC$x
done

for x in COPROC{0..5}; do
. /dev/stdin <<RUN
    read -r -u \${$x[0]}; echo \$REPLY
    echo "$x <- main" >&\${$x[1]}
    read -r -u \${$x[0]}; echo \$REPLY
RUN
done

und dann

# ./coproc.sh 
declare -a COPROC0='([0]="21" [1]="16" [2]="23")'
declare -a COPROC1='([0]="24" [1]="19" [2]="26")'
declare -a COPROC2='([0]="27" [1]="22" [2]="29")'
declare -a COPROC3='([0]="30" [1]="25" [2]="32")'
declare -a COPROC4='([0]="33" [1]="28" [2]="35")'
declare -a COPROC5='([0]="36" [1]="31" [2]="38")'
coproc[0] -> main
COPROC0 <- main
coproc[1] -> main
COPROC1 <- main
coproc[2] -> main
COPROC2 <- main
coproc[3] -> main
COPROC3 <- main
coproc[4] -> main
COPROC4 <- main
coproc[5] -> main
COPROC5 <- main

Und los geht, laichen was auch immer. die <(:) öffnet ein anonymes Rohr über Prozess Substitution, die stirbt, aber die Rohrstöcke herum, weil Sie haben einen Griff zu ihm. Normalerweise mache ich ein sleep 1 statt : wegen seiner leicht anzüglich, und ich würde eine „Datei busy“ Fehlermeldung erhalten - nie passiert, wenn ein echter Befehl läuft (zB command true)

"heredoc Sourcing":

. /dev/stdin <<EOF
[...]
EOF

Das funktioniert auf jedem einzelnen Schale ich je ausprobiert habe, einschließlich busybox / etc (initramfs). Ich habe es noch nie zuvor getan gesehen, entdeckte ich es unabhängig, während Stoßen, die Quelle args akzeptieren wusste könnte? Aber es dient oft als viel handliche Form von eval, wenn es so etwas gibt.

nohup blah &

Ersetzen Sie Ihren Prozessname für blah!

Persönlich mag ich den Befehl 'Partie'.

$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D

Dieses stopft es in in den Hintergrund, und dann Mails Ihnen die Ergebnisse. Es ist ein Teil von cron.

Wie andere erwähnt haben, einen Prozess im Hintergrund laufen zu lassen, so dass Sie von Ihrer SSH-Sitzung trennen können, müssen Sie den Prozess im Hintergrund haben, richtig distanziere mich von seinem Steueranschluss - das ist der pseudo-tty, dass die SSH-Sitzung verwendet.

finden Sie Informationen über laufende Prozesse in Bücher wie Stevens' "Advanced Network-Programm, Band 1, 3. Aufl" oder Rochkind des "Advanced Unix Programming" daemonizing.

Ich habe vor kurzem (in den letzten paar Jahren) hatte mit einem widerspenstigen Programm beschäftigen, die sich nicht richtig daemonize. Am Ende hat ich das tun, indem Sie ein generisches daemonizing Programm zu schaffen - ähnlich wie nohup aber mit mehr Kontrollen verfügbar

.
Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
  -V          print version and exit
  -a          output files in append mode (O_APPEND)
  -b          both output and error go to output file
  -c          create output files (O_CREAT)
  -d dir      change to given directory
  -e file     error file (standard error - /dev/null)
  -h          print help and exit
  -i file     input file (standard input - /dev/null)
  -k fd-list  keep file descriptors listed open
  -m umask    set umask (octal)
  -o file     output file (standard output - /dev/null)
  -s sig-list ignore signal numbers
  -t          truncate output files (O_TRUNC)
  -p          print daemon PID on original stdout
  -x          output files must be new (O_EXCL)

Der Doppel-Bindestrich ist optional auf Systeme nicht das GNU getopt () Funktion; es notwendig ist (oder Sie haben POSIXLY_CORRECT in der Umgebung angeben) unter Linux usw. Da Doppel-Bindestrich funktioniert überall, ist es am besten, es zu benutzen.

Sie können mich noch wenden (Vorname Nachname at gmail dot com dot), wenn Sie die Quelle für daemonize wollen.

Allerdings ist der Code nun (endlich) auf GitHub verfügbar in meiner SOQ (Stapel Überlauf Fragen) Repository als Datei daemonize-1.10.tgz in der Pakete Unterverzeichnis.

Wenn Sie Bildschirm verwenden, um einen Prozess als root ausführen, passen sie von der Möglichkeit der Erhöhung von Berechtigungen Angriffe. Wenn Ihr eigenes Konto irgendwie beeinträchtigt wird, wird es eine direkte Möglichkeit, den gesamten Server zu übernehmen.

Wenn dieser Prozess regelmäßig ausgeführt werden muss, und Sie haben ausreichend Zugriff auf den Server, eine bessere Option wäre cron zu verwenden, um den Lauf der Job. Sie könnten auch init.d (der Super-Daemon) benutzen, um Ihren Prozess im Hintergrund zu starten, und es kann, sobald es fertig ist beenden.

Auf einem Debian-basiertes System (auf dem entfernten Rechner) Installieren Sie:

  

sudo apt-get install tmux

Verbrauch:

  

tmux

     

Ausführen von Befehlen Sie wollen

Sitzung umbenennen:

  

Strg + B und $

     

gesetzt Name

Sitzung verlassen:

  

Strg + B und D

(dies lässt die tmux Sitzung). Dann können Sie aus SSH anmelden.

Wenn Sie brauchen, um wieder auf sie zurück / Check kommen, starten SSH, und geben Sie

  

tmux befestigen session_name

Es wird Sie zurück zu Ihrem tmux Sitzung.

nohup ist sehr gut, wenn Sie Ihre Daten in einer Datei protokolliert werden sollen. Aber wenn es um Hintergrund geht es nicht möglich, es geben ein Kennwort ein, wenn Ihre Skripte für fragen. Ich glaube, Sie müssen screen versuchen. es ist ein Dienstprogramm, das Sie auf Ihrer Linux-Distribution mit yum zum Beispiel auf CentOS yum install screen installieren können dann auf dem Server über Kitt oder eine andere Software, in der Shell-Typ screen. Es öffnet Bildschirm [0] in Kitt. Machen Sie Ihre Arbeit. Sie können mehr Bildschirm [1], Bildschirm [2], etc in gleicher Kitt Sitzung erstellen.

Grundbefehle, die Sie wissen müssen:

Bildschirm starten

Bildschirm


c reate nächster Bildschirm

ctrl + a + c


, um zu n ext Bildschirm Sie erstellt

ctrl + a + n


d Etach

ctrl + a + d


Während der Arbeit schließen Sie Ihren Kitt. Und das nächste Mal, wenn Sie sich einloggen über Kitt Typ

screen -r

auf dem Bildschirm, um wieder an, und Sie können Ihr Prozess noch läuft auf dem Bildschirm sehen. Und den Bildschirmtyp #exit zu verlassen.

Für weitere Details siehe man screen.

Für die meisten Prozesse können Sie Pseudo-daemonize mit diesem alten Linux-Kommandozeilen-Trick:

# ((mycommand &)&)

Zum Beispiel:

# ((sleep 30 &)&)
# exit

Dann ein neues Terminalfenster starten und:

# ps aux | grep sleep

Wird das sleep 30 zeigen läuft noch.

Was Sie getan haben, um den Prozess als Kind eines Kindes gestartet wird, und wenn Sie das nohup Befehl beenden, die normalerweise um den Prozess zu beenden nicht kaskadieren nicht auf das Enkelkind auslösen würde, sie als Waise verlassen Prozess noch ausgeführt wird.

Ich ziehe dieses "es gesetzt und vergessen" -Ansatz, keine Notwendigkeit, mit nohup zu beschäftigen, screen, tmux, I / O-Umleitung oder irgendwelchen von diesem Zeug.

nohup kann ein Client-Prozess nicht, wenn ein der Eltern-Prozess für Argument wird getötet, getötet zu werden, wenn Sie abmelden. Noch besser noch verwenden:

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

nohup macht den Prozess Sie immun gegen Beendigung beginnen, die Ihre SSH-Sitzung und seine untergeordneten Prozesse töten sind auf Sie sich abmelden. Der Befehl i gab liefert Ihnen eine Art und Weise Sie die pid der Anwendung in einer pid-Datei speichern kann, so dass Sie correcly es später töten können und ermöglicht das Verfahren auszuführen, nachdem Sie abgemeldet haben.

Mit dem Bildschirm. Es ist sehr einfach zu bedienen und funktioniert wie vnc für Terminals. http://www.bangmoney.org/presentations/screen.html

Wenn Sie bereit sind, X-Anwendungen als auch laufen - verwenden XPRAs zusammen mit "screen"

Ich würde mich auch für das Bildschirmprogramm entscheiden (ich weiß, dass eine andere Antwort „Bildschirm“ war, aber das ist eine Vervollständigung)

nicht nur die Tatsache, dass &, Strg+Z bg disown, nohup usw.Es könnte für Sie eine böse Überraschung sein, dass der Job beim Abmelden immer noch abgebrochen wird (ich weiß nicht warum, aber es ist mir passiert, und es hat mich nicht gestört, weil ich auf die Verwendung des Bildschirms umgestiegen bin, aber ich schätze, die Anthonyrisinger-Lösung ist doppelt so hoch Eine Gabelung würde das lösen), auch der Bildschirm hat eine wesentlich Vorteil gegenüber reinem Hintergrundwissen:

screen will background your process without losing interactive control to it

Und übrigens, das ist eine Frage, die ich nie stellen würde :) ...Ich verwende screen von Anfang an, wenn ich irgendetwas unter Unix mache ...Ich arbeite (fast) NIEMALS in einer Unix/Linux-Shell, ohne vorher den Bildschirm zu starten ...Und ich sollte jetzt aufhören, sonst beginne ich eine endlose Präsentation darüber, was ein guter Bildschirm ist und was er für Sie tun kann ...Schauen Sie selbst nach, es lohnt sich ;)

Es gibt auch den Daemon Befehl des Open-Source-libslack Pakets.

daemon ganz konfigurierbar ist und kümmert sich um alle der mühsamen Daemon Sachen wie automatischen Neustart, Protokollierung oder pidfile Handhabung.

Fügen Sie diese Zeichenfolge an Ihren Befehl:> & - 2> & - <& - &. > & - Mittel schließen stdout. 2> & - Mittel schließen stderr. <& - Mittel schließen stdin. & Einrichtung, die im Hintergrund laufen. Dies funktioniert programmatisch einen Job über ssh zu starten, auch:

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$

Ich benutzte Bildschirmbefehl. Dieser Link hat ausführlich darüber, wie dies zu tun

https://www.rackaid.com / blog / linux-Screen-Tutorial-and-how-to / # beginnen

akzeptierte Antwort vorschlagen, mit nohup . Ich würde eher vorschlagen, mit PM2 . Mit PM2 über nohup hat viele Vorteile, wie die Anwendung am Leben zu erhalten, Log-Dateien für die Anwendung und viel mehr andere Funktionen aufrechtzuerhalten. Weitere Einzelheiten check this out .

So installieren Sie PM2 müssen Sie npm zum Download bereit. Für Debian-basiertes System

sudo apt-get install npm

und für Redhat

sudo yum install npm

Sie können auch folgen diese Anweisung . Nach der Installation von npm es verwenden, um zu installieren PM2

npm install pm2@latest -g

Wenn ihr getan Sie Ihre Anwendung starten können durch

$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

Zur Prozessüberwachung sind folgende Kommandos:

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

Verwalten von Prozessen entweder App-Name oder Prozess-ID mit oder alle Prozesse verwalten zusammen:

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

Log-Dateien finden Sie in

$HOME/.pm2/logs #contain all applications logs

Binary ausführbare Dateien können auch mit PM2 ausgeführt werden. Sie haben, um eine Änderung in der jason-Datei vorgenommen. Ändern Sie den "exec_interpreter" : "node", "exec_interpreter" : "none". (siehe

Auf systemd / Linux, systemd-run ist ein nettes Tool sitzungs unabhängige Prozesse zu starten. Haters Gonna hassen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top