När jag kör dessa fyra kommandon på Xubuntu 16.04, antingen lokalt eller över ssh, verkar de alla göra exakt samma sak:
export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
-
gedit &
-
gedit & disown
-
nohup gedit
-
nohup gedit & disown
Jag vet inte få skillnaden mellan gedit &
och gedit & disown
för om jag dödar moderterminalen eller loggar ut från en ssh-session, verkar det som gedit ”avvisas” i båda fallen.
När det gäller två och tre är den enda skillnaden jag ser att kommandoutgången loggas till en separat fil och fortsätter att loggas till den separata loggen även om den ursprungliga skalsessionen som skapade bg-processen dödades.
När det gäller tre och fyra läser jag hela tiden att det finns en teknisk skillnad, men förstår inte alls varför skulle du föredra varandra.
Vilken ska jag använda? Jag har sett alla fyra kommandon som används i självstudier och Q & Som, och trots några riktigt bra svar som beskriver de tekniska skillnaderna mellan nohup och disown, kan jag inte få en tydlig rekommendation (utom för loggningsändamål eller skalkompatibilitet) för vilken jag ska använda.
Kommentarer
- Du behöver & i alla fall där du vill fortsätta i skalet (och programmet gafflar inte sig själv). Du kanske inte behöver nohup för program som stänger filbeskrivarna och kopplar från sig själva (det. Gibt är sant för de flesta GUI-applikationer). Du kan använda avvisa efter omständigheterna (om du glömmer nohup) och som skrivits innan GUI-appar inte behöver det.
Svar
När jag behöver köra ett skript som körs lång tid , och jag är på en ssh
-session, jag vill ha antingen:
-
Uppgiften ska fortsätta även när nätverket går sönder eller när jag packar min bärbara dator och går bort .
a. Uppgiften kan slutföras utan interaktiv inmatning från mig.
nohup do_my_stuff &
b. Uppgiften kan behöva något från mig på stdin .
man tmux history -w tmux do_my_stuff
-
Bakgrundsprocessen förbättrar på något sätt min nuvarande session och borde dö tillsammans med sessionen. En sällsynthet.
enhance_my_session >>/tmp/enhance.$$.log 2>&1 &
-
Jag vill att saken ska spotta några loggar slumpmässigt vid min ssh-session. Vänta, vad? Nej, jag skulle aldrig vilja ha det. Tack du
disown
. -
En annan sak som jag aldrig vill ha: konvertera processen till en helt fristående demon, men undvik att starta den automatiskt vid nästa start. Jag skulle aldrig vilja ha det eftersom jag inte kan förutsäga när systemet startar om och vem som startar om det.
Svar
Normalt gör jag bara följande:
-
myprog &
om jag bara vill köra något i bakgrunden från mitt nuvarande inloggningsskal. Detta är tillräckligt för mig 99% av tiden … -
nohup myprog > /my/path/output.txt &
om jag startar något från skalet men vill logga ut efteråt (kanske medan bakgrundsuppgiften fortfarande körs).
Svara
Du måste skilja sig från att skjuta från att avbryta terminalen.
- Skalet dödar alla kända jobb (men inte deras barn) när det får en avbrottssignal.
- Terminalen dödar allt för vilket det var den kontrollerande terminalen.
Generellt sett är den bästa lösningen (på användarnivå) IMHO screen
.
Om din uppgift är ganska systemrelaterad än användarrelaterad kan du göra den till en systemd-tjänst istället som du startar manuellt.