Я искал это раньше, но так и не смог найти ответ.
В Windows, если у меня открыто окно консоли, введите winmine
и нажмите enter, появится Minesweeper, совершенно отдельный от программы cmd. Экземпляр Minesweeper не связан с командой Prompt каким-либо известным мне способом, за исключением того, что для родительского Minesweeper установлен этот экземпляр команды Prompt. Однако в Linux все по-другому.
В Linux, если у меня открыто окно консоли, введите emacs
и нажмите enter, откроется Emacs, но, похоже, он связан с командной строкой. В частности, похоже, что я больше не могу использовать командную строку, пока этот экземпляр Emacs не будет закрыт. Есть ли способ реплицировать поведение Windows в Linux?
Спасибо!
В bash
, detach
является встроенным, используется следующим образом:
emacs &
detach %+ # or % + the number in brackets printed after the above
В zsh
вы можете отсоединить фон и выполнить одну операцию:
emacs &|
Добавьте &
к командной строке:
emacs &
Это поместит emacs в фоновый режим и позволит вам продолжать использовать ваш терминал.
Обратите внимание, что это все равно оставит emacs как подпроцесс вашего терминала, и когда вы выйдете из терминала, он также выйдет из emacs. Чтобы избежать этого, введите:
(emacs &)
Скобки указывают терминалу отключить процесс emacs от терминала.
Тем не менее, сообщения stdout и stderr из программы будут отображаться на терминале. Чтобы предотвратить это, используйте:
(emacs &> /dev/null &)
Используйте Nohup
. Как это: Nohup amarok &
Надеюсь это поможет.
Я разместил ответ на более старую ветку схожей темы с ответами из разных источников. Ниже приводится копия этого ответа, адаптированная для этой темы.
Следующие работы:
$ (gui_app &> /dev/null &)
Это ответ Натана Феллмана плюс перенаправление.
«&>/dev/null» перенаправляет как stdout, так и stderr на нулевое устройство. Последний амперсанд заставляет процесс работать в фоновом режиме. Скобки вокруг команды приведут к тому, что ваш «gui_app» будет запущен в подоболочке.
Выполнение этого отсоединит процесс «gui_app» от консоли, с которой вы выполняете эту команду. Так что даже если вы закроете окно, в котором запущен эмулятор родительского терминала, «gui_app» не закроется. Я запустил это, затем просмотрел дерево процессов с помощью команды «pstree» и обнаружил, что приложение, запущенное таким образом, станет дочерним процессом для «init».
Например,
$ gui_app &> /dev/null &
запустит приложение в фоновом режиме, но оно станет дочерним процессом консольного процесса и прекратит работу при закрытии терминала. (Хотя выход из терминала через bash с помощью команды выхода или Ctrl-D позволит bash очиститься, передав фоновый процесс init.)
«Nohup» работает так, как предложил NawaMan, но по умолчанию перенаправляет вывод и ошибку в файл. Как ответил JeffG, команда «disown» (если она доступна в Shell) может отсоединить процесс от терминала после запуска фонового процесса:
$ gui_app &
$ disown
(Кстати, все это относится к bash. Я уверен, что другие оболочки имеют другие методы/синтаксис для этого.)
Некоторая справка: Отказ от процессов (UNIX Power Tools)
Если это простой вызов приложения с графическим интерфейсом - без сложных опций и тому подобного - кажется, что использование средства запуска, такого как "gmrun" или dmenu (предупреждение: громкий звук), также является хорошим вариантом. Свяжите это с комбинацией клавиш. Я пока не пользуюсь лаунчером, но попробовал эти два.
ПРИМЕЧАНИЕ: CarlF в комментариях другого потока сообщает о приложениях GUI, запущенных с помощью метода "gui_app &", не закрывается при выходе из родительского терминала. Я думаю, что мы закрывали терминал по-разному. Я закрывал окно, в котором работал эмулятор терминала. Я думаю, что он, возможно, выходил из эмулятора терминала через оболочку (команда выхода или Ctrl-D). Я проверил это и увидел, что выход через bash не останавливает запуск GUI в качестве фонового процесса терминала, как говорит CarlF. Кажется, что bash передает фоновые процессы инициализации, когда ему дают возможность очистить. Фактически, это должен быть механизм, с помощью которого фоновый процесс, запущенный в подоболочке, передается init.
util-linux включает в себя инструмент с именем setsid, который в основном делает то, что делает detach:
$ setsid someprogram
Это запустит someprogram
в новом сеансе.
Попробуйте ввести xemacs &
, чтобы открыть XEmacs в фоновом режиме.
Пожалуйста, не называйте это «эмуляцией поведения Windows». Уч.
Вы также можете:
Я поместил следующий код в исполняемый файл сценария с именем «sbg» для «тихий фон». Он делает все необходимое, чтобы полностью отключить программу, запускаемую из командной консоли: перенаправляет stdin, stdout и stderr из/в /dev/null
, игнорирует зависания, работает в фоновом режиме и отключается.
#!/bin/bash
Nohup "[email protected]" &>/dev/null & disown %%
Тогда вы можете просто сделать sbg emacs
. Вы также можете передать любые аргументы, которые вы хотите: sbg emacs --daemon FILE1 FILE2
.
если вы используете bash, вы можете отказаться от процесса:
% firefox &
% disown
command &
Поставьте амперсанд после команды.
Вы можете использовать эту единственную строку:
$ emacs & disown
Как говорят другие ответы, вы можете использовать следующее:
$ emacs &
Если вы забыли &
, просто нажмите Ctrl-z
и используйте bg
:
[1]+ Stopped emacs
$ bg
[1]+ emacs &
$
К вашему сведению: Ctrl-z
останавливает процесс emacs и bg
отправляет в фоновый режим.
Поместите это в свой ~/.bashrc
:
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 "[email protected]"
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
Теперь вам не нужно запоминать, какие программы X11, и выполнять для них специальные манипуляции, потому что они будут отключаться автоматически. Обратите внимание, что setsid
лучше, чем Nohup
, потому что последний блокирует сигнал HUP, а это не то, что вам нужно.
Постскриптум Теперь вы готовы winmine
- в Linux.
просто использование &
, как в $ x &
, оставляет процесс подключенным к терминалу. Я выбрал небольшую программу под названием detach
http://inglorion.net/software/detach/ которую я назвал псевдонимом d
, это немного похоже на Nohup
, но не оставляет после себя файл журнала, который я использую, чтобы отделить mupdf : d mupdf x.pdf