So verhindern Sie unter Linux, dass ein Hintergrundprozess nach dem Schließen des SSH-Clients gestoppt wird
-
08-07-2019 - |
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??
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 Auf systemd / Linux, systemd-run ist ein nettes Tool sitzungs unabhängige Prozesse zu starten. Haters Gonna hassen "exec_interpreter" : "node"
, "exec_interpreter" : "none".
(siehe