Как правильно запустить приложение с графическим интерфейсом через Терминал?

Некоторые приложения с графическим интерфейсом запускаются корректно через командную строку терминала, но некоторые - нет, и они заставляют терминал ждать завершения приложения. Даже тогда некоторые не "выпускают" командную строку.

Таинственный амперсанд & суффикс, кажется, заставляет терминал переводить процесс в фоновый режим (но я не уверен, что там происходит).

Есть ли способ запустить приложение через Терминал, чтобы не было эффекта "зависания", как запуск чего-либо через Alt+F2?

Мне бы хотелось, чтобы снова была доступна командная строка, без чего-либо еще в фоновом режиме и печати в терминале.

11 ответов

Решение

В случае с Гедитом, я просто постоянно держу копию открытой. Пока у вас есть работающая копия, запуск gedit звонки с терминала и последующее закрытие терминала не убьют gedit.

Что касается других вещей, то, что сказали другие люди, тоже подойдет. Я фанат nohup... Но если вам нужен терминал, который вы можете отсоединить, а затем снова подключить, вы хотите посмотреть на screen,

  1. Запустите его в терминале, а затем запустите что-то, что продолжает выводить данные. Я использую сервер разработки Django, но irssi или даже watch uptime были бы хорошими примерами.
  2. Убейте терминал и начните новый.
  3. Бежать screen -r и БУМ, ты вернулся.

screen намного больше, чем это, и вы можете объединить его с byobu для лучшего терминального опыта. Читать вокруг.

Предполагать gedit это программа, которую вы хотите запускать отдельно (она называется "disowned", "disentangled", "decoupled"). Существуют разные способы, в зависимости от того, что именно вы хотите сделать:

Программа уже запущена

открестился:

disown -h это путь, если вы хотите сделать это с уже запущенной программой (то есть, если вы забыли nohup Это). Сначала вы должны остановить его, используя Ctrl+Z. Затем вы можете вставить в Brackground, используя bg [jobId] (например bg 1). Вы получаете список запущенных заданий с их идентификатором jobId, используя jobs, После этого вы можете отделить его от терминала, используя disown -h %[jobId], Пример терминальной сессии:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

Программа еще не запущена

поЬир

nohup не всегда присутствует на всех машинах. Если вы знаете, что хотите отделить заранее, вы должны использовать:

nohup gedit &

Возможно, вам захочется перенаправить вывод оболочки, а ваша программа - псевдо-источник ввода, поэтому: nohup ./myprogram > foo.out 2> bar.err < /dev/null &, Вы хотите перенаправить вывод, чтобы он не раздражал его или использовал его позже. Нулевой ввод может помочь предотвратить взлеты в ssh и тому подобное.

подоболочка:

Вы можете достичь аналогичного эффекта,

$ (geany >/dev/null 2>&1 &)

Скобки открывают новую оболочку для запуска gedit. >/dev/null 2>&1 перенаправляет вывод оболочки в никуда (подавляя вывод). И & в конце ставит процесс в фоновом режиме.

Терминальное мультиплексирование

Также терминальное мультиплексирование с использованием экрана или бёбу. Вы в основном запускаете программу в собственном терминале. Я действительно могу рекомендовать Бёбу и по другим причинам. Ниже приведен список сочетаний клавиш, которые могут пригодиться для ваших первых шагов:

Полезное:

  • F2 Создать новое окно
  • F3 Перейти к следующему окну
  • F4 Перейти к предыдущему окну
  • F6 Отключиться от сеанса и выйти
  • Shift-F6 Отключиться от сеанса, но не выходить из системы
  • F7 Войдите в режим прокрутки / поиска
  • Ctrl-F5 Переподключить любые сокеты или агенты SSH/GPG

Менее полезно:

  • Shift-F2 Разделить экран по горизонтали
  • Ctrl-F2 Разделить экран по вертикали
  • Shift-F3 Переместить фокус на следующий раздел
  • Shift-F4 Переместить фокус на предыдущее разделение
  • Shift-F5 Свернуть все расколы
  • F5 Обновить все уведомления о статусе
  • F8 Переименовать текущее окно
  • F9 Запустить меню конфигурации Byobu
  • Клавиша Escape экранаF12 GNU
  • Alt-Pageup Прокрутите назад историю этого окна.
  • Alt-Pagedown Прокрутите вперед историю этого окна
  • Ctrl-a! Включить или выключить все сочетания клавиш Бёбу

'At' демон и другие

at хороший полезный маленький инструмент для запуска команды в назначенное время. Может быть "неправильно использовано", чтобы отделить команду от оболочки:

echo './myprogram myoption1 myoption2' | at now

Также вы можете посмотреть в setsid а также start-stop-daemon, но других методов должно быть достаточно.

Чтобы запустить приложение и отсоединить его от запущенного терминала, используйте &!.

firefox &!

Таинственный суффикс амперсанда "&", кажется, заставляет терминал переводить процесс в фоновый режим... (но я не уверен, что там происходит).

Это так, и часто это то, что вы хотите. Если вы забыли использовать &, вы можете приостановить программу с помощью ctrl-z, затем поместить ее в фоновый режим с помощью команды bg - и продолжать использовать эту оболочку.

Процесс ' stdin, stdout и stderr все еще подключен к терминалу; вы можете перенаправить их из / в /dev/null или из любого другого файла (например, где-нибудь сохранить журнал вывода), по желанию:

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

Вы можете увидеть процесс в заданиях, вернуть его на передний план (команда fg) и отправить ему сигналы (команда kill).

Некоторые графические программы отсоединяются от терминала; если это так, то когда вы запустите команду "нормально", вы заметите, что она запускает графическую программу и "выходит".


Вот короткий скрипт, вы можете поместить его в ~ / bin, который я назвал runbg:

#!/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

Я смотрю программу ($prog) перед перенаправлением, чтобы можно было сообщать об ошибках в ее поиске. Запустите его как "runbg your-command args..."; вы все равно можете перенаправить stdout/err в файл, если вам нужно где-то сохранить вывод.

За исключением перенаправлений и обработки ошибок, это эквивалентно ответу htorque.

Использование nohup

nohup - это программа, которая запускает данную команду с игнорируемыми сигналами зависания, поэтому команда может продолжить работу в фоновом режиме после завершения родительского процесса. Смотрите справочную страницу

Например:

nohup gedit something

Откройте терминал, введите экран, введите команду, которую хотите запустить, закройте терминал. Программа должна продолжаться в сеансе экрана GNU.

XDG открыть

Посмотрите на эту универсальную утилиту: https://linux.die.net/man/1/xdg-open

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

 $ xdg-open .

Это откроет файл PDF в программе чтения PDF.

 $ xdg-open foo.pdf

Вы даже можете предоставить веб-URL

$ xdg-open www.google.com

Это сработало для меня:

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

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

nohup gedit & exit

И это все. Он открывает Gedit и закрывает терминал при запуске Gedit. Поскольку gedit сейчас не связан с терминалом, он остается активным.

Это работает даже внутри скрипта (как и псевдонимы, трейлер '&' обычно не разрешен в скриптах, потому что они не интерактивны):

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

Это сработало для меня:

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
Другие вопросы по тегам