GNU/Linux >> Znalost Linux >  >> Linux

Kdy použít Nohup?

Chtěl bych znát účel nohup v těchto dnech .

Ptám se, protože jsem to četl

Nohup je zkratka pro „No Hangups“. Není to příkaz, který spustíte sám. Nohup je doplňkový příkaz, který říká systému Linux, aby nezastavil další příkaz, jakmile se spustí. To znamená, že bude pokračovat, dokud nebude dokončen, i když se uživatel, který jej spustil, odhlásí. Syntaxe pro nohup je jednoduchá a vypadá asi takto:

nohup sh your-script.sh &

Všimněte si „&“ na konci příkazu. To přesune příkaz na pozadí a uvolní terminál, ve kterém pracujete.

Nohup pracuje s téměř jakýmkoli příkazem, který spustíte v terminálu. Lze jej spouštět pomocí vlastních skriptů i standardních systémových příkazů a nástrojů příkazového řádku.

S použitím linuxových distribucí, jako je SLES 11.4 nebo RHEL/CentOS 7.x, mohu

  • vzdálené přihlášení k linuxu přes síť přes SSH
  • spusťte níže uvedený jednoduchý program nebo jakýkoli jiný pomocí ./a.out &
  • odhlásit se z linuxu; zadejte exit v terminálu putty SSH
  • můj ukázkový program níže nebo jakýkoli jiný, včetně skriptů shell bash, csh nebo tcsh, běží až do konce v pořádku bez potřeby nohup
  • zadáním exit do putty ukončíte relaci SSH, domnívám se, že se to kvalifikuje jako odhlášení?

nouhup nějaký účel nebo hodnotu dnes? Je to věc jádra>=3.x? Jak dlouho si pamatuji (kernel>=2.6), nikdy jsem nepoužil nohup a vždy používali pouze & bez problémů.

Může mi někdo poskytnout praktický scénář, kde je nohup by bylo použito?

#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

Na Centos 7.7, optiplex pc přihlášení pomocí klávesnice a myši, můj účet je bash. Dělám nohup ./mysleep.sh a poté control-z . Při psaní jobs Vidím [1]+ Stopped nohup ./mysleep.sh

A ps -ef | grep mysleep ukazuje, že ID procesu existuje, ale pokud zavřu okno terminálu pomocí X v pravém horním rohu, tento proces zmizí, takže se zdá, že nohup nefunguje?

Přijatá odpověď:

vzdálené přihlášení do linuxu přes síť přes SSH … odhlášení z linuxu; zadejte exit v terminálu putty SSH

Může mi někdo poskytnout praktický scénář, kde je nohup by bylo použito?

Tak určitě. Za předpokladu, že váš shell je bash (viz níže proč), místo psaní exit nebo ^D , zadejte ~. na začátku řádku, což způsobí, že se váš ssh klient odpojí :

$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
  PID TTY      STAT   TIME COMMAND

Místo sleep můžete použít svůj program; a místo odpojení přes ~. , můžete zabít svého ssh klienta nebo havarovat počítač, na kterém běží. Chcete, aby to váš proces přežil? Použijte nohup 😉

Související:Debian – Proč ‚ls‘ najednou zalamuje položky mezerami do jednoduchých uvozovek?

Přerušení spojení způsobí ukončení procesu serveru, který spravuje jeho druhý konec, což způsobí, že jádro (jakékoli unixové/linuxové jádro) strhne pseudoterminál vytvořený ssh a odešle SIGHUP signál vedoucímu relace (bash shell), který podle bash manuálu:

Shell se standardně ukončí po obdržení SIGHUP . Před ukončením
interaktivní shell znovu odešle SIGHUP na všechny úlohy, spuštěné nebo
zastavené. Zastavené úlohy jsou odeslány SIGCONT abyste zajistili, že obdrží SIGHUP .

Mnoho lidí tuto funkci bash zaměňuje s a) běžná věc s řízením úloh implementovaná jádrem, která odešle pouze SIGCONT /SIGHUP spárovat s zastaveno , nikoli do běhu pracovních míst [1] a b) další funkce bash (shopt -s huponexit ), což způsobí přihlášení bash shell k odeslání SIGHUP na své úlohy i při normálním ukončení (např. přes exit ).

[1] a zastaveno job je úloha (=skupina procesů), která obsahuje alespoň jeden zastavený proces. Proces se zastaví jako efekt výchozí akce signálu jako SIGTSTP , SIGSTOP , SIGTTIN nebo SIGTTOU . Procesy, které „spí“ na blokujícím systémovém volání, jako je read , nanosleep , select , atd. nejsou považovány za zastavené, ale za běžící.

Proč nohup nemusí vždy pomoci

nohup pouze nastaví dispozice SIGHUP ignorovat a provést některá přesměrování, to nezaručuje že proces nebude zabit jinými způsoby.

a) Pokud nohup .. úloha je zastavena , interaktivní bash mu také pošle SIGTERM signál, nejen SIGHUP /SIGCONT pár:

Pokud dojde k pokusu o ukončení bash, zatímco jsou úlohy zastaveny […], shell vypíše varovnou zprávu […] Pokud je proveden druhý pokus o ukončení bez zasahujícího příkazu, shell nevytiskne další varování a všechny zastavené úlohy jsou ukončeno .

[ukončeno =odeslal SIGTERM signál; toto je další funkce ksh/bash, která není přítomna ve všech shellech]

To vše lze obejít jednoduchými triky, jako je double-forks a vytvořením nové relace pomocí setsid(1) , ale

b) systemd může také „vyčistit“ odhlášenou relaci násilným zabitím (pomocí SIGTERM následuje SIGKILL ) všechny zbývající procesy, pokud jeho KillUserProcesses nastavení je zapnuto, což je výchozí nastavení v některých distribucích.


Linux
  1. Kdy a proč bych měl používat Apt-get Update?

  2. Kdy použít dedikovaný server

  3. Použití SSH k otevření aplikace na ploše

  1. Odebrat sdílenou paměť posix, když se nepoužívá?

  2. Používat zařízení přes SSH?

  3. Udržování spuštěné Java aplikace, když je SSH ve službě Google Cloud zavřené

  1. Použití / při použití cd

  2. ssh zpoždění při připojení

  3. Jak zjistit, zda se používá připojení ssh ControlMaster