På skrivebordet med Bash skal jeg bruge ' & ', nohup, disown, eller en kombination af de tre for at starte en proces og få den til at køre helt alene?

Når jeg kører disse fire kommandoer på Xubuntu 16.04, enten lokalt eller over ssh, ser de alle ud til at gøre nøjagtigt det samme:

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally 
  1. gedit & 
  2. gedit & disown 
  3. nohup gedit 
  4. nohup gedit & disown 

Jeg har ikke t få forskellen mellem gedit & og gedit & disown for hvis jeg dræber den overordnede terminal eller logger ud af en ssh-session, ser det ud til at gedit er “afvist” i begge scenarier.

Hvad angår to og tre, er den eneste forskel, jeg ser, at kommandooutputtet er logget på en separat fil og vil fortsat være logget på den separate log, selvom den oprindelige shell-session, der skabte bg-processen, dræbes.

Hvad angår tre og fire, læser jeg vedvarende, at der er en teknisk forskel, men kan slet ikke forstå, hvorfor du foretrækker det ene over det andet.

Hvilken skal jeg bruge? Jeg har set alle fire kommandoer brugt i tutorials og Q & Som, og på trods af nogle rigtig gode svar, der beskriver de tekniske forskelle mellem nohup og disown, kan jeg ikke synes at få en klar anbefaling (undtagen måske til logning eller shell-kompatibilitet) til hvilken jeg skal bruge.

Kommentarer

  • Du har brug for & i alle tilfælde, hvor du vil fortsætte i skallen (og programmet forkaster sig ikke). Du har muligvis ikke brug for nohup til programmer, der lukker filbeskrivelserne og adskiller sig selv (det. Gibt gælder for de fleste GUI-applikationer). Du kan bruge afvisning efter det faktum (hvis du glemmer nohup) og som skrevet før GUI-apps ikke har brug for det.

Svar

Når jeg skal køre et script, der kører lang tid , og jeg er på en ssh -session, jeg vil enten:

  1. Opgaven skal fortsætte, selv når netværket går i stykker, eller når jeg pakker min bærbare computer og går væk .

    a. Opgaven kan afsluttes uden interaktiv input fra mig.

     nohup do_my_stuff & 

    b. Opgaven har muligvis brug for noget fra mig på stdin .

     man tmux history -w tmux do_my_stuff 
  2. Baggrundsprocessen forbedrer på en eller anden måde min nuværende session og skal dø sammen med sessionen. En sjældenhed.

     enhance_my_session >>/tmp/enhance.$$.log 2>&1 & 
  3. Jeg vil have, at tingene spytter nogle logfiler tilfældigt ved min ssh-session. Vent, hvad? Nej, det vil jeg aldrig have. Tak dig disown.

  4. En anden ting, som jeg aldrig vil have: konvertere processen til en fuldstændig løsrevet dæmon, men undgå at starte den automatisk ved næste opstart. Det ville jeg aldrig ønske, fordi jeg ikke kan forudsige, hvornår systemet genstarter, og hvem der genstarter det.

Svar

Typisk gør jeg bare følgende:

  1. myprog & hvis jeg bare vil køre noget i baggrunden fra min nuværende login shell. Dette er tilstrækkeligt for mig 99% af tiden …

  2. nohup myprog > /my/path/output.txt & hvis jeg starter noget fra skallen, men ønsker at log ud bagefter (måske mens baggrundsopgaven stadig kører).

Svar

Dig skal adskille sig fra at afslutte skallen fra at afbryde terminalen.

  1. Skallen dræber alle kendte job (men ikke deres børn), når den får et afbrudssignal.
  2. Terminalen dræber alt, som det var den kontrollerende terminal for.

Generelt er den bedste løsning (på brugerniveau) IMHO screen.

Hvis din opgave snarere er systemrelateret end brugerrelateret, kan du muligvis gøre den til en systemtjeneste i stedet for, som du starter manuelt.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *