Ich würde gerne den Zweck von nohup
erfahren heute .
Ich frage, weil ich das gelesen habe
Nohup ist die Abkürzung für „No Hangups“. Es ist kein Befehl, den Sie selbst ausführen. Nohup ist ein zusätzlicher Befehl, der das Linux-System anweist, einen anderen Befehl nicht zu stoppen, sobald es gestartet wurde. Das bedeutet, dass es weiter ausgeführt wird, bis es fertig ist, auch wenn sich der Benutzer, der es gestartet hat, abmeldet. Die Syntax für nohup ist einfach und sieht etwa so aus:
nohup sh your-script.sh &
Beachten Sie das „&“ am Ende des Befehls. Dadurch wird der Befehl in den Hintergrund verschoben, wodurch das Terminal, in dem Sie arbeiten, freigegeben wird.
Nohup funktioniert mit fast jedem Befehl, den Sie im Terminal ausführen. Es kann sowohl mit benutzerdefinierten Skripten als auch mit Standardsystembefehlen und Befehlszeilenprogrammen ausgeführt werden.
Mit Linux-Distributionen wie SLES 11.4 oder RHEL/CentOS 7.x kann ich
- Remote-Anmeldung bei Linux über das Netzwerk per SSH
- Führen Sie das einfache Programm unten oder irgendein anderes aus, indem Sie
./a.out &
ausführen - von Linux abmelden; geben Sie exit in das Putty-SSH-Terminal ein
- mein Beispielprogramm unten oder jedes andere, einschließlich bash-, csh- oder tcsh-Shell-Skripts, läuft problemlos bis zum Ende, ohne dass
nohup
erforderlich ist - Exit in Putty eingeben, um eine SSH-Sitzung zu schließen, würde ich denken, dass dies als Abmeldung gilt?
Gibt es einen Zweck oder Wert mit nouhup
heute? Ist es ein Kernel>=3.x-Ding? So lange ich mich erinnern kann (Kernel>=2.6), habe ich nie nohup
verwendet und habe immer nur &
verwendet ohne Probleme.
Kann mir jemand ein praktisches Szenario geben, in dem nohup
verwendet werden?
#include <stdlib.h>
#include <stdio.h>
/*
sample C code, to print numbers to a file named zz.tmp
the numbers 0 to 29 over 30 seconds
*/
int main ( int argc, char *argv[] )
{
FILE *fp;
int i;
i = 0;
fp = fopen("zz.tmp", "w" );
while ( i < 30 )
{
fprintf( fp, "%dn", i++ );
sleep( 1 );
}
fclose( fp );
return 0;
}
mysleep.sh
#!/bin/bash
sleep 1000
Auf Centos 7.7, Optiplex-PC-Anmeldung mit Tastatur und Maus, mein Konto ist bash. Ich mache nohup ./mysleep.sh
und dann control-z . Bei der Eingabe von jobs
Ich sehe [1]+ Stopped nohup ./mysleep.sh
Ein ps -ef | grep mysleep
zeigt, dass die Prozess-ID vorhanden ist, aber wenn ich das Terminalfenster über X in der oberen rechten Ecke schließe, verschwindet dieser Prozess, sodass es so aussieht, als wäre er nohup
funktioniert nicht?
Akzeptierte Antwort:
Remote-Anmeldung bei Linux über das Netzwerk per SSH … bei Linux abmelden; Geben Sie exit
ein im Putty-SSH-Terminal
Kann mir jemand ein praktisches Szenario geben, in dem nohup
verwendet werden?
Sicher. Angenommen, Ihre Shell ist Bash (siehe unten, warum), anstatt exit
einzugeben oder ^D
, geben Sie ~.
ein am Anfang einer Zeile, was dazu führt, dass Ihr SSH-Client die Verbindung trennt :
$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
PID TTY STAT TIME COMMAND
Sie können Ihr Programm anstelle von sleep
verwenden; und anstatt die Verbindung über ~.
zu trennen , können Sie Ihren ssh-Client beenden oder die Maschine, auf der er läuft, zum Absturz bringen. Sie wollen, dass Ihr Prozess das übersteht? Verwenden Sie nohup
😉
Das Unterbrechen der Verbindung führt dazu, dass der Serverprozess, der sein anderes Ende verwaltet, beendet wird, was dazu führt, dass der Kernel (jeder Unix/Linux-Kernel) das von ssh erstellte Pseudo-Terminal abbaut und ein SIGHUP
sendet Signal an den Sitzungsleiter (die Bash-Shell), was laut Bash-Handbuch:
Die Shell wird standardmäßig beim Empfang eines SIGHUP
beendet . Vor dem Beenden
sendet eine interaktive Shell erneut das SIGHUP
auf alle laufenden oder
angehaltenen Jobs. Gestoppte Jobs werden mit SIGCONT
gesendet um sicherzustellen, dass sie den SIGHUP
erhalten .
Viele Leute verwechseln diese Bash-Funktion mit a) die vom Kernel implementierte reguläre Jobsteuerung, die nur ein SIGCONT
sendet /SIGHUP
Paar zum gestoppt , nicht zum Laufen Jobs [1] und b) ein weiteres Bash-Feature (shopt -s huponexit
), was zu einer Anmeldung führt Bash-Shell, um ein SIGHUP
zu senden auch beim normalen Beenden (z. B. über exit
). ).
[1] a angehalten Job ist ein Job (=Prozessgruppe), der mindestens einen gestoppten Prozess enthält. Ein Prozess wird als Folge der Standardaktion eines Signals wie SIGTSTP
gestoppt , SIGSTOP
, SIGTTIN
oder SIGTTOU
. Prozesse, die bei einem blockierenden System „schlafen“, rufen wie read
auf , nanosleep
, select
, usw. gelten nicht als angehalten, sondern als ausgeführt.
Warum nohup
hilft nicht immer
nohup
setzt nur die Disposition von SIGHUP
zu ignorieren und führt einige Weiterleitungen aus, es garantiert nicht dass der Prozess nicht auf andere Weise beendet wird.
a) Wenn der nohup ..
Auftrag wird angehalten , sendet ihm eine interaktive Bash auch ein SIGTERM
Signal, nicht nur ein SIGHUP
/SIGCONT
Paar:
Wenn ein Versuch unternommen wird, Bash zu beenden, während Jobs gestoppt sind […], gibt die Shell eine Warnmeldung aus […] Wenn ein zweiter Versuch unternommen wird, Bash ohne einen dazwischenliegenden Befehl zu beenden, gibt die Shell keine weitere Warnung aus, und alle gestoppten Jobs werden es tun beendet .
[beendet =einen SIGTERM
gesendet Signal; dies ist ein weiteres ksh/bash-Feature, das nicht in allen Shells vorhanden ist]
All dies kann durch einfache Tricks wie Double-Forks und das Erstellen einer neuen Sitzung mit setsid(1)
umgangen werden , aber
b) systemd
kann auch eine abgemeldete Sitzung „aufräumen“, indem sie zwangsweise beendet wird (mit SIGTERM
gefolgt von SIGKILL
) alle übrig gebliebenen Prozesse, wenn es KillUserProcesses
ist Die Einstellung ist aktiviert, was in einigen Distributionen die Standardeinstellung ist.