Moet ik op het bureaublad met Bash ' & ', nohup, disown, of een combinatie van de drie om een proces te starten en het volledig zelfstandig te laten draaien?

Wanneer ik deze vier commandos op Xubuntu 16.04 uitvoer, lokaal of via ssh, lijken ze allemaal precies hetzelfde te doen:

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 

Ik wil niet krijg het verschil tussen gedit & en gedit & disown want als ik de ouderterminal dood of uitlog bij een SSH-sessie, lijkt het erop dat gedit is “verstoten” in beide scenarios.

Wat betreft twee en drie, het enige verschil dat ik zie is dat de uitvoer van de opdracht wordt gelogd naar een apart bestand en zal blijven worden gelogd naar dat afzonderlijke logboek, zelfs als de oorspronkelijke shell-sessie die het bg-proces veroorzaakte, wordt beëindigd.

Wat betreft drie en vier, blijf ik lezen dat er een technisch verschil is, maar ik kan helemaal niet begrijpen waarom je de ene boven de andere zou verkiezen.

Welke moet ik gebruiken? Ik heb alle vier de commandos gezien die in tutorials worden gebruikt en Q & Als, en ondanks enkele echt geweldige antwoorden die de technische verschillen tussen nohup en disown beschrijven, kan ik “geen duidelijke aanbeveling krijgen (behalve misschien voor logging doeleinden of shell-compatibiliteit) waarvoor ik zou moeten gebruiken.

Opmerkingen

  • Je hebt & nodig in alle gevallen waarin je verder wilt gaan in de shell (en het programma splitst zichzelf niet). Misschien heb je nohup niet nodig voor programmas die de bestandsdescriptors sluiten en zichzelf loskoppelen (dat geldt voor de meeste GUI-applicaties). U kunt disown achteraf gebruiken (als u nohup vergeet) en zoals eerder geschreven, hebben GUI-apps het niet nodig.

Answer

Wanneer ik een script moet uitvoeren dat lange tijd kan draaien, en ik” m op een ssh sessie, ik wil ofwel:

  1. De taak moet doorgaan, zelfs als het netwerk breekt of als ik mijn laptop inpak en wegga .

    a. De taak kan worden voltooid zonder interactieve input van mij.

     nohup do_my_stuff & 

    b. De taak heeft mogelijk iets van mij nodig op stdin .

     man tmux history -w tmux do_my_stuff 
  2. Het achtergrondproces verbetert op de een of andere manier mijn huidige sessie en zou samen met de sessie moeten verdwijnen. Een zeldzaamheid.

     enhance_my_session >>/tmp/enhance.$$.log 2>&1 & 
  3. Ik wil dat het ding willekeurig wat logs spuugt tijdens mijn ssh-sessie. Wacht, wat? Nee, dat zou ik nooit willen. Bedankt you disown.

  4. Iets anders dat ik nooit wil: converteren het proces naar een volledig ontkoppelde daemon, maar vermijd het automatisch te starten bij de volgende keer opstarten. Ik zou dat nooit willen omdat ik niet kan voorspellen wanneer het systeem opnieuw zal opstarten en wie het opnieuw zal opstarten.

Antwoord

Meestal doe ik gewoon het volgende:

  1. myprog & als ik gewoon iets op de achtergrond wil uitvoeren vanuit mijn huidige login-shell. Dit is voor mij 99% van de tijd voldoende …

  2. nohup myprog > /my/path/output.txt & als ik iets vanuit de shell start, maar het wil log daarna uit (misschien terwijl de achtergrondtaak nog loopt).

Answer

Jij moet onderscheid maken tussen het verlaten van de shell en het afbreken van de terminal.

  1. De shell doodt alle bekende banen (maar niet hun kinderen) wanneer het een annuleringssignaal krijgt.
  2. De terminal doodt alles waarvoor het de controlerende terminal was.

In het algemeen is de beste oplossing (op gebruikersniveau) IMHO screen.

Als uw taak eerder systeemgerelateerd dan gebruikersgerelateerd is, kunt u er een systeemservice van maken die u handmatig start.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *