Vraag Programma's uitvoeren op de achtergrond vanaf een terminal


Hoe voer ik een programma uit op de achtergrond van een shell, met de mogelijkheid om de shell te sluiten terwijl het programma wordt uitgevoerd? Laten we zeggen dat mijn gebruikersinterface problemen heeft of om een ​​of andere reden, ik moet een programma opstarten vanuit het terminalvenster, laten we zeggen, nm-applet:

nm-applet

Wanneer het is gestart, bezet het de voorgrond van het terminalvenster.

Is er een eenvoudige manier om het programma op de achtergrond uit te voeren zonder de terminal open te hoeven laten of de hele terminal te bezetten?

Op die opmerking vond ik een manier om programma's uit te voeren vanaf de terminal en het toestaan ​​voor andere ingangen, door toevoeging van een ampersand (&) voor het commando als zodanig:

nm-applet &

Maar dit is niet veel nuttig, omdat alle processen die in de terminal zijn gestart, worden gedood zodra de terminal is gesloten.


121
2018-02-22 00:07


oorsprong


nohup 'command' & Dit lijkt te werken. Heb je hier problemen mee? - OVERTONE


antwoorden:


Ik ben onlangs gaan houden van setsid. Het begint met het lijken alsof je gewoon iets vanaf de terminal uitvoert, maar je kunt de verbinding verbreken (de terminal sluiten) en hij blijft maar doorgaan.

Dit komt omdat de opdracht eigenlijk wegvalt en terwijl de invoer doorkomt naar de huidige terminal, het eigendom is van een geheel andere ouder (die in leven blijft nadat u de terminal hebt gesloten).

Een voorbeeld:

setsid gnome-calculator

Ik ben ook behoorlijk partieel disown die kan worden gebruikt om een ​​proces van de huidige boom te scheiden. Je gebruikt het in combinatie met het background-ampersand:

gnome-calculator & disown

Ik hoorde ook net over het uitzetten van subschalen met haakjes. Deze eenvoudige methode werkt:

(gnome-calculator &)

En natuurlijk is dat zo nohup zoals je zei. Ik ben niet wild van nohup omdat het de neiging heeft om te schrijven ~/nohup.out zonder dat ik het had gevraagd. Als je daar op vertrouwt, is het misschien iets voor jou.

nohup gnome-calculator

En voor de processen op de langere termijn zijn er dingen zoals screen en andere virtuele terminal-muxers die sessies tussen verbindingen levend houden. Deze zijn waarschijnlijk niet echt van toepassing op u omdat u alleen tijdelijke toegang tot de terminaluitgang wilt, maar als u dat wilde ga terug enige tijd later en bekijk de nieuwste terminalactiviteit, zou het scherm waarschijnlijk uw beste keuze zijn.

Het internet zit vol met screen tutorials maar hier is een eenvoudige quick-start:


156
2018-02-22 00:41



Oli, in het geval van DISPLAY =: 0 unity --replace welke van de bovenstaande zou u gebruiken en waarom? - nutty about natty
@nuttyaboutnatty wikkel het geheel in zijn eigen shell-sessie: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Dat is zo'n beetje mijn oplossing voor alles om ervoor te zorgen dat het goed gaat. - Oli♦
@nuttyaboutnatty Dat is wat ik bedoel, maar je zou niet eindigen met twee instanties omdat --replace doet hoe het klinkt en beëindigt eigenlijk de oude instantie. Als u het de tweede keer binnen de xsessie uitvoert, wordt de kopie gebonden aan TTYn beëindigd en kunt u dit later gebruiken als u het nodig had. Er is waarschijnlijk een betere manier om het te doen dan alleen wat me te binnen schiet telkens ik het nodig heb. - Oli♦
Perfect, degene die voor me werkte was de subshell '(gnome-calculator &)'. Ik gebruik het om een ​​mono-console-app op de achtergrond te starten. Met de andere technieken zou de mono-app onmiddellijk crashen. - Nikolaos Georgiou
Opmerking voor toekomstige gebruikers: creatie van nohup.out kan worden onderdrukt door zowel stdout als sterr om te leiden naar /dev/null zoals zo: nohup firefox &> /dev/null & - Sergiy Kolodyazhnyy


Dit zijn de twee manieren waarop ik zou gaan. Ten eerste omdat het niet vanaf een terminal wordt uitgevoerd; raken alt+F2 om het dialoogvenster Uitvoeren te openen en het vanaf daar uit te voeren (zonder &).

Van een terminal, rennen

nm-applet &

Sluit de terminal echter NIET zelf. Dat wil zeggen: raak de X-knop niet om te sluiten en gebruik Bestand -> Afsluiten niet in de menubalk. Als je de terminal op die manier sluit, stuurt hij een HUP (Hang UP) -signaal naar de bash binnen, die op zijn beurt het HUP-signaal naar al zijn kinderen zal sturen (daarom werkt nohup in dit geval).

In plaats daarvan verlaat je de shell door te draaien exit of slaan Ctrl+D. bash zal dan zijn kinderen verwerpen en vervolgens afsluiten, terwijl de achtergrondprocessen nog steeds actief zijn. En wanneer bash ophoudt, heeft de terminal zijn kindproces verloren, dus het zal ook sluiten.

Alles tegelijk doen:

nm-applet & exit

46
2018-02-23 11:45



Dat is geweldig! Ik heb dat nooit geweten en jij lijkt de enige te zijn om dit te noemen. Dat is absoluut mijn favoriete benadering in een desktopomgeving. Jammer dat ik niet meer kan upvote; p - 7hi4g0
Ik probeerde dit met een andere applicatie en het is mislukt: matlab & exit Lopen als twee afzonderlijke commando's werkte goed: matlab &  exit - MattKelly
Ik vroeg me af waarom OP zei dat het sluiten van de terminal ervoor zorgde dat zijn achtergrondprogramma's crashten. Ik heb nog nooit geprobeerd een terminal te sluiten met de "x" -knop op het venster. - user1717828
de x-knop is dodend, deze wordt niet netjes afgesloten, het exit-commando wel. je zou in plaats daarvan de x-knop opnieuw kunnen toewijzen aan een exit-opdracht ... - Tim Baker


Zoals je al zei, kun je rennen

nohup nm-applet &  

om het eindsignaal te negeren bij het sluiten van de terminal. Geen probleem daarmee.


13
2018-02-22 00:17



Nog andere alternatieven? Alleen omwille van de wetenschap, niet voor iets anders - OVERTONE
Op wikipedia ( en.wikipedia.org/wiki/Nohup ) Er is een suggestie om te gebruiken echo command | at now waarvan ik het niet kon laten werken. - desgua
Ik vraag me af hoe het werkt vanuit een gebruikersinterface wanneer je dubbelklikt op een pictogram of programma. - OVERTONE


Een ding dat veel andere antwoorden missen, is hoe je een lopend proces kunt loskoppelen dat momenteel de shell blokkeert. In de meeste terminals en shells, Ctrl+Z zal het lopende proces stoppen en u terugbrengen naar een invoerprompt. Dan kunt u uitgeven

bg

om het lopende proces naar de achtergrond te sturen. Kwestie

fg

in plaats daarvan om het lopende proces weer op de voorgrond te zetten.

BEWERK: Meer informatie in dit antwoord Ik ontdekte later.


10
2018-03-31 14:37





Gebruik (exec PROGRAM &> /dev/null & ) om PID van subshell te laten overnemen door PROGRAM. Ik heb deze aanpak meerdere keren getest met verschillende programma's. Het sluiten van de oorspronkelijke terminal heeft geen invloed op het nieuw aangemaakte programma

Kleine demo:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

7
2017-11-30 11:35



Hmmm (exec firefox) hangt de terminal op totdat ik Firefox afsluit ... en de terminal SIGHUPs sluit de shell en de subshell - kos
Ik heb mijn antwoord bewerkt. Getest met verschillende andere programma's. Ik heb in deze versie firefox of een ander programma dat de controleterminal ophangt, niet waargenomen - Sergiy Kolodyazhnyy
werkt goed voor mij - Zanna


Ik kan de byobu-terminal aanbevelen. U kunt uw proces gemakkelijk loskoppelen door op de F6-toets te drukken.


2
2018-03-05 00:07





Hoewel er bovenstaande goede antwoorden zijn, wil ik mijn 2 cent geven over hoe ik MATLAB op de achtergrond gebruik.

sudo -b matlab

De -b tag van sudo kan applicaties op de achtergrond uitvoeren. U kunt ook de terminal sluiten na het uitvoeren van deze opdracht.

Waarschijnlijk niet gerelateerd, maar er is een prachtige website die u kunt gebruiken om shell-opdrachten uit te leggen. http://explainshell.com/explain/8/sudo


1
2018-06-28 14:39





Ik weet het niet op de juiste manier, maar ik start gewoon een andere sessie terwijl ik de vorige alleen laat. Ik had bijvoorbeeld een eenvoudige webserver op mijn raspberry. de web.py één. dan begin ik een nieuwe sessie terwijl ik hem alleen laat. dat is het. het is ook handig omdat je nog steeds wordt bijgewerkt, ook al werk je aan de andere sessie.


0
2017-07-05 22:15



Welkom bij Ask Ubuntu! ik raad aan Bewerkdit antwoord om het uit te breiden met specifieke details over hoe dit te doen. (Zie ook Hoe schrijf ik een goed antwoord? voor algemeen advies over wat voor soort antwoorden het meest waardevol zijn op Ask Ubuntu.) - David Foerster