På skrivebordet med Bash, skal jeg bruke ' & ', nohup, disown, eller en kombinasjon av de tre for å starte en prosess og få den til å kjøre helt alene?

Når jeg kjører disse fire kommandoene på Xubuntu 16.04, enten lokalt eller over ssh, ser de ut til å gjøre nøyaktig 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å forskjellen mellom gedit & og gedit & disown fordi hvis jeg dreper foreldreterminalen eller logger ut av en ssh-økt, ser det ut til at gedit blir «avvist» i begge scenarier.

Når det gjelder to og tre, er den eneste forskjellen jeg ser at kommandoutgangen logges til en egen fil og vil fortsette å logges til den separate loggen selv om den opprinnelige skalløkten som skapte bg-prosessen blir drept.

Når det gjelder tre og fire, leser jeg stadig at det er en teknisk forskjell, men kan ikke forstå i det hele tatt hvorfor skulle du foretrekke hverandre.

Hvilken skal jeg bruke? Jeg har sett alle fire kommandoene som brukes i opplæringsprogrammer og Q & Som, og til tross for noen virkelig gode svar som beskriver de tekniske forskjellene mellom nohup og disown, kan jeg ikke se ut til å få en klar anbefaling (bortsett fra kanskje for loggingsformål eller shell-kompatibilitet) som jeg skal bruke.

Kommentarer

  • Du trenger & i alle tilfeller der du vil fortsette i skallet (og programmet forkaster seg ikke). Du trenger kanskje ikke nohup for programmer som lukker filbeskrivelsene og kobler fra seg selv (det. Gibt stemmer for de fleste GUI-applikasjoner). Du kan bruke avvisning etter hvert (hvis du glemmer nohup) og som skrevet før GUI-apper ikke trenger det.

Svar

Når jeg trenger å kjøre et skript som vil kjøre i lang tid , og jeg er på en ssh -økt, jeg vil enten:

  1. Oppgaven skal fortsette selv når nettverket går i stykker eller når jeg pakker den bærbare datamaskinen min og går bort .

    a. Oppgaven kan fullføres uten interaktiv innspill fra meg.

     nohup do_my_stuff & 

    b. Oppgaven trenger kanskje noe fra meg på stdin .

     man tmux history -w tmux do_my_stuff 
  2. Bakgrunnsprosessen forbedrer på en eller annen måte min nåværende økt og burde dø sammen med økten. En sjeldenhet.

     enhance_my_session >>/tmp/enhance.$$.log 2>&1 & 
  3. Jeg vil at tingen skal spytte noen logger tilfeldig på ssh-økten min. Vent, hva? Nei, jeg vil aldri ha det. Takk du disown.

  4. En annen ting som jeg aldri vil ha: konvertere prosessen til en helt løsrevet demon, men unngå å starte den automatisk ved neste oppstart. Jeg ville aldri ønsket det fordi jeg ikke kan forutsi når systemet vil starte på nytt og hvem som skal starte det på nytt.

Svar

Vanligvis gjør jeg bare følgende:

  1. myprog & hvis jeg bare vil kjøre noe i bakgrunnen fra mitt nåværende påloggingsskall. Dette er tilstrekkelig for meg 99% av tiden …

  2. nohup myprog > /my/path/output.txt & hvis jeg starter noe fra skallet, men vil logg av etterpå (kanskje mens bakgrunnsoppgaven fortsatt kjører).

Svar

Du må skille seg ut av at skallet avbryter terminalen.

  1. Skallet dreper alle kjente jobber (men ikke barna deres) når det får et signal om avbrudd.
  2. Terminalen dreper alt som det var den kontrollerende terminalen for.

Generelt sett er den beste løsningen (på brukernivå) IMHO screen.

Hvis oppgaven din er ganske systemrelatert enn brukerrelatert, kan du gjøre den til en systemtjeneste i stedet som du starter manuelt.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *