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

89

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

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

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

Спасибо!

Джейсон
источник
Пожалуйста, дайте ответ geekosaur.
Джошуа Робисон,
в windows7 это minesweeper.exe, здесь C: \ Program Files \ Microsoft Games \ Minesweeper, поэтому minesweeper.exe обычно не работает .. так как этот каталог не в пути .. И в любом случае, вы должны указать версию windows
barlop

Ответы:

10

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

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

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

emacs &|
geekosaur
источник
108

Добавить &в командную строку :

emacs &

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

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

(emacs &)

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

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

(emacs &> /dev/null &)
Натан Феллман
источник
9
Мне особенно нравится (emacs &) совет.
1
если вы уже запустили задачу (emancs), используйте CTRL-Z для перехода в спящий режим, а затем команду «bg» для отправки в фоновый режим.
Джаян
@StackTrace: если вы сделаете это и закроете свой терминал, он также убьет emacs.
Натан Феллман
1
ОК .. Я использовал "nohup" отсоединить это. Это не может быть сделано после запуска процесса ...
Jayan
При нажатии Ctrl+ Cв окне терминала эта команда была выполнена, процесс прекращается: <
Ричард де Вит
21

Используйте nohup. Нравится:nohup amarok &

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

NawaMan
источник
19

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


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

$ (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» (если она доступна в оболочке) может отсоединить процесс от терминала после того, как вы запустили фоновый процесс:

$ gui_app &
$ disown

(Кстати, все это относится к bash. Я уверен, что другие оболочки имеют другие методы / синтаксис для этого.)

Некоторая справка: Отказ от процессов (UNIX Power Tools)

Если это простой вызов приложения с графическим интерфейсом - без сложных опций и тому подобного - кажется, что использование средства запуска, такого как "gmrun" или dmenu (предупреждение: громкий звук), также является хорошим вариантом. Свяжите это с комбинацией клавиш. Я пока не пользуюсь лаунчером, но попробовал эти два.

ПРИМЕЧАНИЕ. CarlF в комментариях других потоков сообщает, что приложения с графическим интерфейсом, запущенные с помощью метода gui_app &, не закрываются при выходе из родительского терминала. Я думаю, что мы закрывали терминал по-разному. Я закрывал окно, в котором работал эмулятор терминала. Я думаю, что он мог выходить из эмулятора терминала через оболочку (команда выхода или Ctrl-D). Я проверил это и увидел, что выход через bash не останавливает запуск GUI в качестве фонового процесса терминала, как говорит CarlF. Кажется, что bash передает фоновые процессы инициализации, когда ему дают возможность очистить. Фактически, это должен быть механизм, с помощью которого фоновый процесс, запущенный в подоболочке, передается init.

EMPraptor
источник
11

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

$ setsid someprogram

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

tonybaldwin
источник
9

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

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

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

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

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

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

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

Райан Томпсон
источник
решение сценариев работало лучше всего для меня. Спасибо!! хотя я использовал (gui_app &> /dev/null &)вместо этого (ответ @ EMPraptor)
Джими Оке
3
command &

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

Джесси Диллон
источник
3

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

% firefox &
% disown 
JeffG
источник
2

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

$ emacs & disown
Идхам Пердамян
источник
1

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

$ emacs &

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

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

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

MatthewD
источник
0

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

Дэн Д.
источник
0

Поместите это в свой ~/.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 "$@"
        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, который вам не нужен.

PS Теперь вы уже winmineв Linux.

midenok
источник