Vraag Hoe schoon je een GUI-app op via de Terminal (wacht niet op beëindiging)?


Sommige GUI-apps worden netjes gestart via de opdrachtregel van Terminal.

Sommige niet, en ze zorgen ervoor dat de Terminal wacht tot de app wordt beëindigd.
... en zelfs dan "bevrijden" sommige niet de bevellijn.

Het mysterieuze ampersand "&" achtervoegsel, lijkt ervoor te zorgen dat de terminal het proces op de achtergrond zet ... (maar ik weet niet zeker wat daar gebeurt).

Is er een manier om een ​​app te lanceren via de terminal, zodat er geen "hang on" -effect is? ... net als iets lanceren via F2.

Ik wil graag dat de opdrachtregel onmiddellijk weer beschikbaar is (zonder dat er nog steeds iets op de achtergrond staat en een systeembericht in de terminal wegschrijft).


68
2017-10-31 10:50


oorsprong


Op verzoek van htorque heb ik zijn antwoord verwijderd dat u hebt aanvaard. Zou je alsjeblieft nog een antwoord kunnen kiezen (je moet de selectie van htorque de eerste keer ongedaan maken - moet onder aan de pagina rood op de loer liggen) - Oli♦
De methode om met a om te gaan Programma-al-running (zoals geschetst door con-f-gebruik) is goed voor die situatie, maar zoals mijn belangrijkste vraag was clean-launching zonder terminale rommel, Ik heb geaccepteerd screen (genoemd door Oli en RobinJ). Ik ben onder de indruk van het vermogen ervan; na het lezen ervan en het uitproberen ... Het vereist alleen het typen van: screen -d -m gedit (of screen gedit dan Ctrl+a d ontkoppelen) ... en ik heb nog altijd volledige toegang tot de eindweergave van gedit (voor waarschuwingsberichten, enz.) op elk moment via screen -r zelfs als ik in de tussentijd het originele terminalvenster heb gesloten ... - Peter.O


antwoorden:


In het geval van gedit houd ik de hele tijd een kopie open. Zolang je een bestaande kopie hebt lopen, starten gedit oproepen van de terminal en het sluiten van de terminal zal gedit niet doden.

Voor andere dingen, wat andere mensen hebben gezegd zou ook werken. Ik ben een fan van nohup... Maar als u een terminal nodig heeft, kunt u deze loskoppelen en vervolgens opnieuw bevestigen aan, waarnaar u wilt kijken screen.

  1. Voer het uit in een terminal en voer vervolgens iets uit dat de uitvoer pusht. Ik gebruik de Django-ontwikkelserver maar irssi of zelfs watch uptime zou goede voorbeelden zijn.
  2. Dood de terminal en start een nieuwe.
  3. Rennen screen -r en BOOM, je bent weer binnen.

screen is veel groter dan dat en je kunt het combineren met byobu voor een betere terminalervaring. Lees rond.


17
2018-05-31 12:25



Dit is het eerste echte inzicht dat ik heb gehad over wat het scherm doet / kan doen ... bedankt voor de terminaltip ... - Peter.O
scherm is niet langer beschikbaar, maar tmux kan het scherm vervangen. (tmux om een ​​nieuwe tmux-sessie te starten, ctrl + b, druk dan op d om deatach te verwijderen en tmux attach om opnieuw te koppelen) - Gman Smith


Veronderstellen gedit is het programma dat u los wilt laten draaien (ook bekend als "disown", "disentangle", "decouple"). Er zijn verschillende manieren afhankelijk van wat je precies wilt doen:

Programma loopt al

Verloochenen:

disown -h is de manier om te gaan als je dat wilt doen met een reeds actief programma (dat wil zeggen als je het bent vergeten) nohup het). Je moet het eerst stoppen met gebruiken Ctrl+Z. Dan kun je het in de brackground plaatsen met bg [jobId] (B.v. bg 1). U krijgt een lijst met lopende taken met hun jobId-gebruik jobs. Daarna kunt u het ontkoppelen van terminal met disown -h %[jobId]. Voorbeeld terminal sessie:

confus@confusion:~$ gedit 
^Z
[1]+  Stopped                 gedit
confus@confusion:~$ jobs
[1]+  Stopped                 gedit
confus@confusion:~$ bg 1
[1]+ gedit &
confus@confusion:~$ disown -h %1
confus@confusion:~$ exit

Het programma is nog niet gestart

nohup

nohup is niet altijd aanwezig op alle machines. Als u weet dat u vooraf wilt ontkoppelen, gebruikt u:

nohup gedit &

Misschien wilt u de shell-uitvoer ook omleiden en uw programma een pseudo-invoerbron, dus: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Je zou de uitvoer willen omleiden om er niet geïrriteerd door te raken of om het later te gebruiken. De nulinvoer kan helpen hickups in SSH en dergelijke te voorkomen.

subshell:

Je kunt een vergelijkbaar effect bereiken met

confus@confusion:~$ (geany 2>&1 /dev/null &)

De haakjes openen een nieuwe subshell om gedit in te draaien 2>&1 /dev/null leidt de shell-uitvoer om naar nergens (onderdrukking van de uitvoer). En de & op het einde zet het proces op de achtergrond.

Terminal multiplexing

Ook terminalmultiplexen met scherm of byobu. Je draait het programma in feite in een eigen terminal. Ik kan byobu ook om andere redenen echt aanbevelen. Hieronder vindt u een lijst met boybu-snelkoppelingen die handig kunnen zijn voor uw eerste stappen:

Nuttig:

  • F2              Maak een nieuw venster
  • F3              Ga naar het volgende venster
  • F4              Ga naar het vorige venster
  • F6              Maak los van de sessie en log uit
  • Shift-F6        Maak los van de sessie, maar log niet uit
  • F7              Ga naar scrollback / zoekmodus
  • Ctrl-F5         Sluit alle SSH / GPG-sockets of agenten opnieuw aan

Minder handig:

Shift-F2        Splits het scherm horizontaal - Ctrl-F2         Splits het scherm verticaal - Shift-F3        Verplaats de focus naar de volgende split - Shift-F4        Verplaats focus naar de vorige split - Shift-F5        Collapse alle splitsingen - F5              Ververs alle statusmeldingen - F8              Hernoem het huidige venster - F9              Start het Byobu-configuratiemenu - F12             GNU Screen's Escape Key - Alt-Pageup      Blader terug door de geschiedenis van dit venster - Alt-PageDown    Blader vooruit door de geschiedenis van dit venster - Ctrl-a!        Alle sneltoetsen van Byobu aan of uit zetten -

De 'at' deamon en anderen

at is een handig hulpmiddel voor het uitvoeren van een opdracht op een gepland tijdstip. Het kan 'misbruikt' worden om een ​​opdracht uit de shell te verwijderen:

echo './myprogram myoption1 myoption2' | at now

Ook kun je kijken setsid en start-stop-daemon, maar de andere methoden zouden moeten volstaan.


79
2018-05-31 12:28



Tip: als er slechts één taak is, is de taak-ID optioneel, bijvoorbeeld in plaats van bg %1 je kunt gewoon typen bg. - MasterMastic


Het mysterieuze ampersand "&" achtervoegsel, lijkt ervoor te zorgen dat de terminal het proces op de achtergrond zet ... (maar ik weet niet zeker wat daar gebeurt).

Het doet, en is vaak wat je wilt. Als u vergeet om & te gebruiken, kunt u het programma opschorten met ctrl-z en het vervolgens op de achtergrond plaatsen met de bg-opdracht - en die shell blijven gebruiken.

Het proces 'stdin, stdout en stderr zijn nog steeds verbonden met de terminal; je kunt deze naar wens omleiden van / naar / dev / null of elk ander bestand (bijvoorbeeld ergens een uitvoerlogboek opslaan):

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

U kunt het proces in taken zien, het terugbrengen naar de voorgrond (fg-opdracht) en signalen verzenden (kill-opdracht).

Sommige grafische programma's zullen loskomen van de terminal; als dat het geval is, wanneer u het commando "normaal" uitvoert, zult u merken dat het het grafische programma start en "Exits".


hier is een kort script, je kunt het plaatsen ~ / Bin, die ik runbg heb genoemd:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

Ik zoek het programma op ($ prog) voordat ik doorverwijs, zodat fouten bij het vinden ervan kunnen worden gerapporteerd. Voer het uit als "runbg your-command args ..."; je kunt nog steeds stdout / err naar een bestand omleiden als je ergens output wilt opslaan.

Met uitzondering van de omleidingen en foutafhandeling, is dit gelijk aan antwoord van htorque.


25
2017-10-31 11:25



Oké, bedankt ... Het lijkt erop dat ctrl-z (opschorten) geeft me opnieuw toegang tot de opdrachtregel, maar maakt de GUI leeg totdat ik de opdracht uitvoer bg die het lijkt te ontkoppelen. (klinkt logisch) ... Is er nog een bevel waarmee ik de GUI kan loskoppelen ... Aha! Ik begrijp nu wat je bedoelt sighals (kill command)... (interessante dingen deze signalen) .. Ik gebruikte een codefragment om te maken dd voer geleidelijk de statistieken uit .. en deze is gebruikt kill + een SIGNAAL ... Is er een specifiek SIGNAAL om een ​​"baan" los te maken? - Peter.O
Ik heb net je reactie op het antwoord van Rick opgemerkt ... Ik heb het geprobeerd disown jobs -p gedraaid` en het leek erop om de taak te verwijderen .... (maar ik kreeg systeemberichten in de Terminal toen ik gedit manueel sloot ... maar ik denk dat ik op dit moment een verknipte Terminal heb. .. te veel experimenteren :( - Peter.O
@fred: taken worden beheerd door de shell, dus geen signaal kan dat besturen. Misschien vind je het het beste om verschillende shells te starten - verschillende GUI-terminals staan ​​tabbladen toe en je kunt screen of tmux gebruiken.
@fred: beter niet uitvoeren jobs -p command als u meerdere exemplaren van een opdracht tegelijk op de achtergrond uitvoert. je kunt gebruiken jobs om de juiste job id te vinden en doe het dan jobs -p <job-id> om de PID van de baan te krijgen. Persoonlijk vind ik de versie met de subshell een stuk eenvoudiger. ;-) - htorque
@htorque, fred: Je kunt disown zonder parameters uitvoeren om bash de laatste taak te laten verwijderen: gedit & disown


Gebruik nohup

nohup is een programma dat een gegeven commando met ophangsignalen uitvoert   genegeerd, zodat de opdracht op de achtergrond kan blijven werken   nadat het bovenliggende proces is beëindigd. Zie de manpage

Bijvoorbeeld:

nohup gedit something

20
2018-05-31 12:10



Wat is nohup? Geef wat meer informatie alstublieft. - Oxwivi
nohup is een programma dat een bepaalde opdracht uitvoert waarbij hangende signalen worden genegeerd, zodat de opdracht op de achtergrond kan blijven uitvoeren nadat het bovenliggende proces is beëindigd. Zie de manpage - Florian Diesch
Eigenlijk denk ik dat mijn antwoord hier niet klopt. Bij nader inzien, nohup moet in dit scenario worden gebruikt. - boehj
Wanneer een interactieve shell een SIGHUP-signaal ontvangt, kan (al dan niet, afhankelijk van de instellingen) een SIGHUP-signaal verzenden naar al zijn childs. Dit kan gebeuren (of niet, nogmaals) wanneer een terminal gesloten is. Een kind dat niet gereed is om een ​​dergelijk signaal af te handelen, voert de standaardactie uit, d.w.z. exit. De nohup applicatie (en de disown bash builtin) staat niet toe dat het signaal de applicatie bereikt. - enzotib
Een ding om op te letten is dat nohup maakt een bestand aan in de huidige map met de naam nohup.out. Zie de man pagina voor meer details. ik geef de voorkeur aan disown om deze reden, en voor het feit dat disown werkt nadat u bent opgestart gedit. - Flimm


Om een ​​applicatie te starten en los te koppelen van de gelanceerde terminal, gebruikt u & !.

firefox &!

18
2017-10-31 12:20



Goed om te weten, maar dat lijkt alleen zsh te zijn. In bash zou je handmatig moeten uitvoeren disown <pid-of-command> na het starten van het commando op de achtergrond. - htorque
Interessant ... Ik ga kijken naar zsh, maar als een Linux-newbie zal ik voorlopig blijven bash ... Bedankt - Peter.O
wat doet het uitroepteken? - nutty about natty
De ! zal het aanvraagproces van het terminalproces verbreken, zodat u de terminal kunt sluiten zonder dat de toepassing die werd gelanceerd niet kan worden afgesloten. Het lijkt een zsh-ding te zijn, maar handig. - Rick
Maar dit werkte ook in bash @htorque .... Dus ik denk dat het geen probleem is. - Jasser


Open de terminal, typ scherm, typ de opdracht die u wilt uitvoeren, sluit de terminal. Het programma moet blijven draaien in de GNU-scherm sessie.


4
2018-05-31 15:00



Wat is GNU Screen precies? - Oxwivi
Als ik het idee goed begrijp, is het een soort vensterbeheerder voor de opdrachtregel. Hiermee kunt u meer dan één programma tegelijk uitvoeren in een opdrachtregelinterfacesessie. - RobinJ
Byobu? - Oxwivi
Zoiets, alleen Byobu is gemakkelijker te gebruiken. Als ik me vergis, is Byobu gewoon een eenvoudigere interface voor GNU Screen. - RobinJ


Dit werkte voor mij:

$ (nohup gedit 2>/dev/null &)

1
2017-12-30 23:20





Zoals veel mensen dachten, is nohup het ding om te overwegen. Maar nohup stills blijft open op de terminal en geeft de programma-activiteit op de terminal weer die irritant is. U kunt de terminal daarna gewoon sluiten om dit te voorkomen. Ik ontdekte een heel eenvoudige oplossing die ik gebruik.

nohup gedit & exit

En dat is het. Het opent gedit en sluit de terminal wanneer gedit opstart. Omdat gedit nu niet aan de terminal is gekoppeld, blijft het actief.


0
2017-09-03 17:25





Dit werkt zelfs in een script (zoals aliassen is de '&' -trailer normaal gesproken niet toegestaan ​​in scripts omdat ze niet interactief zijn):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'

0
2018-01-02 19:40





Dit werkte voor mij:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null

0
2018-06-13 08:43