
de Linux nohup commando laat belangrijke processen doorgaan, zelfs wanneer het terminalvenster dat ze heeft gestart, is gesloten. We laten je zien hoe je dit eerbiedwaardige commando kunt gebruiken op het huidige Linux.
HUP en SIGHUP
Unix, de voorouder van Linux, is gemaakt voordat de pc werd uitgevonden. Computers waren grote, dure apparaten. Mensen communiceerden met hen via seriële lijnen, ofwel lokaal binnen hetzelfde gebouw of op afstand via trage modemverbindingen. Oorspronkelijk typten ze hun instructies op teleprinters die geleidelijk werden vervangen door domme terminals.
Ze werden dom genoemd omdat de verwerkingskracht in de computer zat waarmee je was verbonden, niet de terminal waarop je aan het typen was. De programma’s draaiden op de computer – waar die zich ook bevond – en niet op het apparaat op je bureau.
Als er iets is gebeurd waardoor de verbinding tussen uw terminal en de computer is verbroken, heeft de computer de lijnbreuk gedetecteerd en een HUP of ophangen signaal naar de programma’s die u had uitgevoerd. De programma’s stopten met uitvoeren toen ze het signaal ontvingen.
Die functionaliteit leeft tegenwoordig voort in Linux. Op uw pc is een terminalvenster een emulatie van een fysieke terminal. Als er processen lopen die vanuit dat terminalvenster zijn gestart en u sluit dat venster SIGHUP signaal wordt naar de programma’s gestuurd, zodat ze op de hoogte zijn van de HUP en weet dat ze moeten stoppen.
Er vindt een cascade-effect plaats. Als de processen onderliggende processen hebben gestart, wordt de SIGHUP ook aan hen doorgegeven, zodat ze weten dat ze moeten worden beëindigd.
De nohup commando start onderliggende processen maar weigert door te geven SIGHUP signalen naar hen. Dat klinkt misschien als een probleem, maar het is eigenlijk een handige functie.
Het nohup-commando
Als u een proces wilt laten doorgaan, zelfs als het terminalvenster van waaruit het is gestart, is gesloten, hebt u een manier nodig om de SIGHUP zodat het programma het nooit ontvangt. (Eigenlijk start het terminalvenster geen processen, ze worden gestart door de shell-sessie in het terminalvenster.) De eenvoudige en elegante oplossing voor dat probleem is om een ander proces tussen de shell-sessie en het programma te plaatsen, en dat te hebben. middle-layer programma geeft nooit de SIGHUP signaal.
Dat is wat nohup doet. Het start programma’s voor u zodat ze een onderliggend proces zijn van nohup, geen kindproces van de shell. Omdat ze geen onderliggend proces van de shell zijn, ontvangen ze niet direct een SIGHUP uit de schil. En als nohup geeft niet door SIGHUP voor zijn kinderen ontvangt het programma geen SIGHUP helemaal niet.
Dit is handig wanneer u bijvoorbeeld een langlopend proces heeft dat u volledig moet laten doorlopen. Als u per ongeluk het terminalvenster en de bijbehorende shell sluit, beëindigt u het proces ook. Gebruik makend van nohup om het proces te starten isoleert het proces van de nohup signaal. Als u op afstand op een computer werkt via SSH en u niet wilt dat een gevoelig proces wordt beëindigd als de externe verbinding mislukt, start u het proces op de externe computer met nohup .
Nohup gebruiken
We hebben een programma gemaakt dat niets nuttigs doet, maar het blijft draaien totdat het wordt beëindigd. Het drukt de tijd elke drie seconden af naar het terminalvenster. Het heet long-proc voor ‘lang proces’.
./long-proc

Als dit een programma was dat iets nuttigs deed en we wilden dat het bleef draaien, zelfs als het terminalvenster en de shell gesloten zijn, dan zouden we het starten met nohup.
nohup ./long-proc

Het proces is losgekoppeld van stdin en stdout dus het kan geen invoer ontvangen of naar het terminalvenster schrijven. Omdat het nog steeds actief is, keert u niet terug naar de opdrachtprompt. Dat allemaal nohup doet is het proces ongevoelig maken voor het sluiten van de terminal. Het verandert het proces niet in een achtergrondtaak.
Moet u nu opnieuw opstarten om het proces te beëindigen? Nee. Om te stoppen a nohup proces dat u niet als achtergrondproces hebt gestart, drukt u op de toetscombinatie Ctrl+C.

De uitvoer van het programma is voor ons vastgelegd in een bestand met de naam “nohup.out”. We kunnen het met minder beoordelen.
less nohup.out

Alles wat normaal gesproken naar het terminalvenster wordt gestuurd, wordt in het bestand vastgelegd. daaropvolgende runs van nohup wordt toegevoegd aan het bestaande bestand “nohup.out”.

Een handiger manier om het proces uit te voeren, is door het te starten met nohup zodat het bestand is tegen het sluiten van het terminalvenster en er tegelijkertijd een achtergrondtaak van maakt. Om dit te doen voegen we een ampersand toe “&” aan het einde van de opdrachtregel.
nohup ./long-proc &

U moet nogmaals op “Enter” drukken om terug te keren naar de opdrachtprompt. Er is ons verteld dat het taaknummer van het proces 1 is – het getal tussen haakjes “[]“— en dat de proces-ID 13115 is.
We kunnen een van deze gebruiken om het proces te beëindigen. “Ctrl+C” werkt nu niet omdat het programma geen associatie heeft met het terminalvenster of de shell.
Als u bent vergeten wat het taaknummer is, kunt u de jobs commando om de achtergrondtaken weer te geven die vanuit dat terminalvenster zijn gestart.
jobs

Om onze taak te doden kunnen we de . gebruiken kill commando en het jobnummer, voorafgegaan door een procentteken “%“, soortgelijk:
kill %1
Als je het terminalvenster hebt gesloten, moet je de proces-ID zoeken en die gebruiken met de kill opdracht. De pgrep commando vindt de proces-ID voor processen die overeenkomen met de zoekaanwijzing die u opgeeft. We zoeken naar de procesnaam.
pgrep long-proc

Nu kunnen we de proces-ID gebruiken om het proces te beëindigen.
kill 13115

De volgende keer dat u op “Enter” drukt, wordt u geïnformeerd dat het proces is beëindigd.
Laten we nu eens kijken naar wat? niet het proces beëindigen. We zullen het opnieuw starten en vervolgens het terminalvenster sluiten.
nohup ./long-proc

Als we een nieuw terminalvenster openen en naar ons proces zoeken met pgrep, we zien dat het nog steeds draait. Het sluiten van het terminalvenster waarmee het proces is gestart, heeft geen effect gehad.
pgrep long-proc

Het is mogelijk om meerdere commando’s door te geven aan: nohup, maar het is meestal beter om ze apart te starten. Het maakt het gemakkelijker om ze te manipuleren als achtergrondtaken. De commando’s worden niet tegelijkertijd uitgevoerd, ze worden een voor een uitgevoerd. De uitvoering is niet gelijktijdig, maar sequentieel. Om ze gelijktijdig te laten werken, moet u ze afzonderlijk starten.
Dat gezegd hebbende, gebruik om meerdere processen tegelijk te starten nohup om een Bash-shell te starten en de te gebruiken -c (commando’s) optie met de reeks commando’s. Gebruik enkele aanhalingstekens “'” om de opdrachtlijst en dubbele ampersands in te pakken “&&” om de opdrachten te scheiden.
nohup bash -c 'ls /bin && ls /sbin'

Als je gebruikt less om door het bestand “nohup.out” te kijken, ziet u de uitvoer van het eerste proces en vervolgens de uitvoer van het tweede proces.
less nohup.out

De uitvoer van beide opdrachten is vastgelegd in het bestand “nohup.out”. Het is niet verweven, de output van het tweede proces begint pas als het eerste proces is beëindigd.

Als u een eigen bestand wilt gebruiken in plaats van “nohup.out”, kunt u de opdracht omleiden naar het bestand van uw keuze.
nohup bash -c 'ls /bin && ls /sbin' > myfile.txt

Merk op dat het bericht niet langer zegt “uitvoer toevoegen aan nohupo.out”, het zegt “stderr omleiden naar stdout” en we sturen stdout om naar ons bestand “myfile.txt”.
We kunnen met minder in het bestand “mijnbestand.txt” kijken.
less myfile.txt

Zoals eerder bevat het de uitvoer van beide opdrachten.

Het is grappig hoe de geschiedenis van een hulpprogramma het soms kan laten lijken alsof het niet relevant was voor de moderne tijd. De nohup opdracht is er daar één van. Iets dat is gemaakt om het hoofd te bieden aan verbroken verbindingen op seriële lijnen, is nog steeds nuttig voor de Linux-gebruikers van vandaag op ongelooflijk krachtige machines.