it-swarm-ru.tech

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

Я искал это раньше, но так и не смог найти ответ.

В Windows, если у меня открыто окно консоли, введите winmine и нажмите enter, появится Minesweeper, совершенно отдельный от программы cmd. Экземпляр Minesweeper не связан с командой Prompt каким-либо известным мне способом, за исключением того, что для родительского Minesweeper установлен этот экземпляр команды Prompt. Однако в Linux все по-другому.

В Linux, если у меня открыто окно консоли, введите emacs и нажмите enter, откроется Emacs, но, похоже, он связан с командной строкой. В частности, похоже, что я больше не могу использовать командную строку, пока этот экземпляр Emacs не будет закрыт. Есть ли способ реплицировать поведение Windows в Linux?

Спасибо!

86
Jason

В bash, detach является встроенным, используется следующим образом:

emacs &
detach %+ # or % + the number in brackets printed after the above

В zsh вы можете отсоединить фон и выполнить одну операцию:

emacs &|
10
geekosaur

Добавьте & к командной строке:

emacs &

Это поместит emacs в фоновый режим и позволит вам продолжать использовать ваш терминал.

Обратите внимание, что это все равно оставит emacs как подпроцесс вашего терминала, и когда вы выйдете из терминала, он также выйдет из emacs. Чтобы избежать этого, введите:

(emacs &)

Скобки указывают терминалу отключить процесс emacs от терминала.

Тем не менее, сообщения stdout и stderr из программы будут отображаться на терминале. Чтобы предотвратить это, используйте:

(emacs &> /dev/null &)
107
Nathan Fellman

Используйте Nohup. Как это: Nohup amarok &

Надеюсь это поможет.

19
NawaMan

Я разместил ответ на более старую ветку схожей темы с ответами из разных источников. Ниже приводится копия этого ответа, адаптированная для этой темы.


Следующие работы:

$ (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.

18
EMPraptor

util-linux включает в себя инструмент с именем setsid, который в основном делает то, что делает detach:

$ setsid someprogram

Это запустит someprogram в новом сеансе.

10
tonybaldwin

Попробуйте ввести xemacs &, чтобы открыть XEmacs в фоновом режиме.

Пожалуйста, не называйте это «эмуляцией поведения Windows». Уч.

Вы также можете:

  • Откройте новый терминал
  • Используйте Alt + F2 или ваш оконный менеджер для запуска программы, вместо использования терминала
  • Использовать экран GNU
9
Borealid

Я поместил следующий код в исполняемый файл сценария с именем «sbg» для «тихий фон». Он делает все необходимое, чтобы полностью отключить программу, запускаемую из командной консоли: перенаправляет stdin, stdout и stderr из/в /dev/null, игнорирует зависания, работает в фоновом режиме и отключается.

#!/bin/bash
Nohup "[email protected]" &>/dev/null & disown %%

Тогда вы можете просто сделать sbg emacs. Вы также можете передать любые аргументы, которые вы хотите: sbg emacs --daemon FILE1 FILE2.

7
Ryan Thompson

если вы используете bash, вы можете отказаться от процесса:

% firefox &
% disown 
3
JeffG
command &

Поставьте амперсанд после команды.

3
Jesse Dhillon

Вы можете использовать эту единственную строку:

$ emacs & disown
2
Idham Perdameian

Как говорят другие ответы, вы можете использовать следующее:

$ emacs &

Если вы забыли &, просто нажмите Ctrl-z и используйте bg:

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

К вашему сведению: Ctrl-z останавливает процесс emacs и bg отправляет в фоновый режим.

1
MatthewD

Поместите это в свой ~/.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.

0
midenok

просто использование &, как в $ x &, оставляет процесс подключенным к терминалу. Я выбрал небольшую программу под названием detachhttp://inglorion.net/software/detach/ которую я назвал псевдонимом d, это немного похоже на Nohup, но не оставляет после себя файл журнала, который я использую, чтобы отделить mupdf : d mupdf x.pdf

0
Dan D.