как запускать программы с графическим интерфейсом linux из командной строки, но отдельно от командной строки?

<p>я искал это раньше, но так и не смог найти ответ.</p><p>в windows, если у меня открыто окно консоли, введите <code>winmine</code> и нажмите enter, появится minesweeper, совершенно отдельный от программы cmd. экземпляр minesweeper не связан с командой prompt каким-либо известным мне способом, за исключением того, что для родительского minesweeper установлен этот экземпляр команды prompt. однако в linux все по-другому.</p><p>в linux, если у меня открыто окно консоли, введите <code>emacs</code> и нажмите enter, откроется emacs, но, похоже, он связан с командной строкой. в частности, похоже, что я больше не могу использовать командную строку, пока этот экземпляр emacs не будет закрыт. есть ли способ реплицировать поведение windows в linux?</p><p>спасибо!</p>

<p>в <code>bash</code>, <code>detach</code> является встроенным, используется следующим образом:</p><pre><code>emacs & detach %+ # or % + the number in brackets printed after the above </code></pre><p>в <code>zsh</code> вы можете отсоединить фон и выполнить одну операцию:</p><pre><code>emacs &| </code></pre>

<p>добавьте <code>&</code> к командной строке:</p><pre><code>emacs & </code></pre><p>это поместит emacs в фоновый режим и позволит вам продолжать использовать ваш терминал.</p><p>обратите внимание, что это все равно оставит emacs как подпроцесс вашего терминала, и когда вы выйдете из терминала, он также выйдет из emacs. чтобы избежать этого, введите:</p><pre><code>(emacs &) </code></pre><p>скобки указывают терминалу отключить процесс emacs от терминала.</p><p>тем не менее, сообщения stdout и stderr из программы будут отображаться на терминале. чтобы предотвратить это, используйте:</p><pre><code>(emacs &> /dev/null &) </code></pre>

<p>используйте <code>nohup</code>. как это: <code>nohup amarok &</code></p><p>надеюсь это поможет.</p>

<p>я разместил <a href="https://superuser.com/questions/61600/starting-gui-program-from-linux-terminal-prevents-further-usage/265964#265964">ответ</a> на более старую ветку схожей темы с ответами из разных источников. ниже приводится копия этого ответа, адаптированная для этой темы.</p><hr><p>следующие работы:</p><pre><code>$ (gui_app &> /dev/null &) это ответ натана феллмана плюс перенаправление.«&>/dev/null» перенаправляет как stdout, так и stderr на нулевое устройство. последний амперсанд заставляет процесс работать в фоновом режиме. скобки вокруг команды приведут к тому, что ваш «gui_app» будет запущен в подоболочке.выполнение этого отсоединит процесс «gui_app» от консоли, с которой вы выполняете эту команду. так что даже если вы закроете окно, в котором запущен эмулятор родительского терминала, «gui_app» не закроется. я запустил это, затем просмотрел дерево процессов с помощью команды «pstree» и обнаружил, что приложение, запущенное таким образом, станет дочерним процессом для «init».например,$ gui\_app &> /dev/null & </code></pre><p>запустит приложение в фоновом режиме, но оно станет дочерним процессом консольного процесса и прекратит работу при закрытии терминала. (хотя выход из терминала через bash с помощью команды выхода или ctrl-d позволит bash очиститься, передав фоновый процесс init.)</p><p>«nohup» работает так, как предложил nawaman, но по умолчанию перенаправляет вывод и ошибку в файл. как ответил jeffg, команда «disown» (если она доступна в shell) может отсоединить процесс от терминала после запуска фонового процесса:</p><pre><code>$ gui_app & $ disown </code></pre><p>(кстати, все это относится к bash. я уверен, что другие оболочки имеют другие методы/синтаксис для этого.)</p><p>некоторая справка: <a href="http://books.google.com/books?id=tddb5zroonwc&pg=sa23-pa10">отказ от процессов (unix power tools)</a> </p><p>если это простой вызов приложения с графическим интерфейсом - без сложных опций и тому подобного - кажется, что использование средства запуска, такого как "gmrun" или <a href="http://www.youtube.com/watch?v=\_s7lreb5kmk&t=29s">dmenu</a> (предупреждение: громкий звук), также является хорошим вариантом. свяжите это с комбинацией клавиш. я пока не пользуюсь лаунчером, но попробовал эти два.</p><p>примечание: carlf в <a href="https://superuser.com/questions/61600/starting-gui-program-from-linux-terminal-prevents-further-usage/265964#265964">комментариях другого потока</a> сообщает о приложениях gui, запущенных с помощью метода "gui\_app &", не закрывается при выходе из родительского терминала. я думаю, что мы закрывали терминал по-разному. я закрывал окно, в котором работал эмулятор терминала. я думаю, что он, возможно, выходил из эмулятора терминала через оболочку (команда выхода или ctrl-d). я проверил это и увидел, что выход через bash не останавливает запуск gui в качестве фонового процесса терминала, как говорит carlf. кажется, что bash передает фоновые процессы инициализации, когда ему дают возможность очистить. фактически, это должен быть механизм, с помощью которого фоновый процесс, запущенный в подоболочке, передается init.</p>

<p>util-linux включает в себя инструмент с именем setsid, который в основном делает то, что делает detach:</p><pre><code>$ setsid someprogram это запустит someprogram в новом сеансе.

попробуйте ввести xemacs &, чтобы открыть xemacs в фоновом режиме.пожалуйста, не называйте это «эмуляцией поведения windows». уч.вы также можете: откройте новый терминал используйте alt + f2 или ваш оконный менеджер для запуска программы, вместо использования терминала использовать экран gnu 

я поместил следующий код в исполняемый файл сценария с именем «sbg» для «тихий фон». он делает все необходимое, чтобы полностью отключить программу, запускаемую из командной консоли: перенаправляет stdin, stdout и stderr из/в /dev/null, игнорирует зависания, работает в фоновом режиме и отключается.#!/bin/bash nohup "$@" &>/dev/null & disown %% </code></pre><p>тогда вы можете просто сделать <code>sbg emacs</code>. вы также можете передать любые аргументы, которые вы хотите: <code>sbg emacs --daemon file1 file2</code>.</p>

<p>если вы используете bash, вы можете отказаться от процесса:</p><pre><code>% firefox & % disown </code></pre>

<pre><code>command & </code></pre><p>поставьте амперсанд после команды.</p>

<p>вы можете использовать эту единственную строку:</p><pre><code>$ emacs & disown 

как говорят другие ответы, вы можете использовать следующее:$ emacs & </code></pre><p>если вы забыли <code>&</code>, просто нажмите <code>ctrl-z</code> и используйте <code>bg</code>:</p><pre><code>[1]+ stopped emacs $ bg [1]+ emacs & $ </code></pre><p>к вашему сведению: <code>ctrl-z</code> останавливает процесс emacs и <code>bg</code> отправляет в фоновый режим.</p>

<p>поместите это в свой <code>~/.bashrc</code>:</p><pre><code>debug\_trap\_skip() { local cmd\_type=$(type -t "$1") # empty cmd\_type is for inexistent command or variable definition, exclude them # and shell builtins except echo, set and env: [[ -z "$cmd_type" || "$cmd\_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] && return 0 return 1 } debug_trap_x11() { if ldd which $1`|grep -q libx11 then setsid "$@" return 0 fi return 1 } debug_trap() { [[ -n "$comp\_line" ]] && return # do nothing if completing [[ "$bash_command" = "$prompt\_command" ]] && return debug\_trap\_skip $bash_command && return 0 debug_trap_x11 $bash\_command && return 1 return 0 } shopt -s extdebug trap debug\_trap debug </code></pre><p>теперь вам не нужно запоминать, какие программы x11, и выполнять для них специальные манипуляции, потому что они будут отключаться автоматически. обратите внимание, что <code>setsid</code> лучше, чем <code>nohup</code>, потому что последний блокирует сигнал hup, а это не то, что вам нужно.</p><p>постскриптум теперь вы готовы <code>winmine</code>- в linux.</p>

<p>просто использование <code>&</code>, как в <code>$ x &</code>, оставляет процесс подключенным к терминалу. я выбрал небольшую программу под названием <code>detach</code> <a href="http://inglorion.net/software/detach/">http://inglorion.net/software/detach/</a> которую я назвал псевдонимом <code>d</code>, это немного похоже на <code>nohup</code>, но не оставляет после себя файл журнала, который я использую, чтобы отделить <a href="http://mupdf.com/">mupdf</a> : <code>d mupdf x.pdf</code></p>