GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wann verwendet man Nohup?

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 😉

Siehe auch:Debian – Warum umschließt „ls“ plötzlich Elemente mit Leerzeichen in einfachen Anführungszeichen?

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.


Linux
  1. Ssh – Beschränken eines Ssh/scp/sftp-Benutzers auf ein Verzeichnis?

  2. Wann sollte ich einen abschließenden Schrägstrich in einem Verzeichnis verwenden?

  3. Verwenden von SSH zum Öffnen der Anwendung auf dem Desktop

  4. Gemeinsam genutzten Posix-Speicher entfernen, wenn er nicht verwendet wird?

  5. Ausführen einer Java-App, wenn SSH in Google Cloud geschlossen ist

Verwenden Sie dieses hilfreiche Bash-Skript, wenn Sie Sterne beobachten

So verwenden Sie die SSH-Portweiterleitung

So verwenden Sie den Linux-nohup-Befehl

So verwenden Sie SSH, um eine Verbindung zu einem Remote-Server herzustellen

So verwenden Sie einen SSH-Schlüssel mit Nicht-Root-Benutzern

Installieren und verwenden Sie WinSCP