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í?
Má 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 SSHMůž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
😉
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šleSIGHUP
na všechny úlohy, spuštěné nebo
zastavené. Zastavené úlohy jsou odeslánySIGCONT
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.