Pe desktopul cu Bash, ar trebui să folosesc ' & ', nohup, disown, sau o combinație a celor trei pentru a începe un proces și l-au rulat complet singur?

Când rulez aceste patru comenzi pe Xubuntu 16.04, fie local, fie pe ssh, toate par să facă exact același lucru:

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 

Eu nu „t obțineți diferența dintre gedit & și gedit & disown deoarece dacă omit terminalul părinte sau mă deconectez de la o sesiune ssh, s-ar părea că gedit este „respins” în oricare dintre scenarii.

În ceea ce privește două și trei, singura diferență pe care o văd este că ieșirea comenzii este înregistrată într-un fișier separat și va continua să fie înregistrată în acel jurnal separat chiar dacă sesiunea originală de shell care a generat procesul bg este ucisă.

În ceea ce privește trei și patru, continuu să citesc că există o diferență tehnică, dar nu pot înțelege deloc de ce ați prefera una peste cealaltă.

Pe care ar trebui să îl folosesc? Am văzut toate cele patru comenzi utilizate în tutoriale și Q & Ca, și în ciuda unor răspunsuri cu adevărat grozave care descriu diferențele tehnice dintre nohup și respingere, nu pot primi o recomandare clară (cu excepția poate pentru scopuri de înregistrare sau compatibilitate shell) pentru care ar trebui să o folosesc.

Comentarii

  • Aveți nevoie de & în toate cazurile în care doriți să continuați în shell (iar programul să nu se forțeze singur). Este posibil să nu aveți nevoie de nohup pentru programele care închid descriptorii de fișiere și se disociază (că Gibt este adevărat pentru majoritatea aplicațiilor GUI). Puteți utiliza refuzul după fapt (dacă uitați nohup) și așa cum este scris înainte ca aplicațiile GUI să nu aibă nevoie de el.

Răspuns

Când trebuie să rulez un script care va rula pe o perioadă lungă de timp , iar eu” m on o sesiune ssh, vreau fie:

  1. Sarcina ar trebui să continue chiar și atunci când rețeaua se întrerupe sau când îmi împachetez laptopul și plec .

    a. Sarcina se poate termina fără intrări interactive de la mine.

     nohup do_my_stuff & 

    b. Sarcina ar putea avea nevoie de ceva de la mine pe stdin .

     man tmux history -w tmux do_my_stuff 
  2. Procesul de fundal îmbunătățește cumva sesiunea mea curentă și ar trebui să moară împreună cu sesiunea. O raritate.

     enhance_my_session >>/tmp/enhance.$$.log 2>&1 & 
  3. Vreau ca chestia să scuipe la întâmplare niște jurnale la sesiunea mea ssh. Așteptați, ce? Nu, nu aș vrea niciodată asta. Mulțumesc tu disown.

  4. Un alt lucru pe care nu-l doresc niciodată: converti procesul către un daemon complet detașat, dar evitați pornirea automată la următoarea pornire. Nu aș vrea niciodată asta pentru că nu pot prezice când va reporni sistemul și cine îl va reporni.

Răspunde

De obicei, fac următoarele:

  1. myprog & dacă vreau doar să rulez ceva în fundal din shell-ul meu actual de conectare. Acest lucru este adecvat pentru mine 99% din timp …

  2. nohup myprog > /my/path/output.txt & dacă pornesc ceva din shell, dar vreau să deconectați-vă după aceea (poate în timp ce sarcina de fundal este încă în desfășurare).

Răspundeți

Dvs. trebuie să deosebească ieșirea shell-ului de la avortarea terminalului.

  1. Shell-ul ucide toate joburile cunoscute (dar nu și copiii lor) atunci când primește un semnal de abort.
  2. Terminalul ucide totul pentru care a fost terminalul de control.

În general, cea mai bună soluție (la nivel de utilizator) IMHO este screen.

Dacă sarcina dvs. este mai degrabă legată de sistem decât de utilizator, ați putea face din acesta un serviciu systemd pe care îl porniți manual.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *