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

78

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

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

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

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

Peter.O
источник
По просьбе htorque я удалил его ответ, который вы приняли. Пожалуйста, не могли бы вы выбрать другой ответ (вам сначала нужно отменить выбор htorque - он должен скрываться внизу страницы красным цветом)
Oli
1
Метод для работы с уже запущенной Программой (как описано в разделе con-f-use) хорош в этой ситуации, но поскольку мой основной вопрос был о чистом запуске без беспорядка терминала , я согласился screen(упомянутое Оли и RobinJ). Я впечатлен его способностями; после прочтения и проверки ... требуется только набрать: screen -d -m gedit(или screen geditзатем Ctrl+a dотключить) ... и у меня все еще есть полный доступ к терминальному представлению gedit (для предупреждающих сообщений и т. д.) в любое время, screen -rдаже если я тем временем закрыли окно оригинального терминала ...
Peter.O
Кстати, некоторые вещи, которые вы приписываете терминалу, фактически выполняются оболочкой, например, интерпретация &суффикса команды. Это может быть полезно для пояснения: в чем разница между терминалом, консолью, оболочкой и командной строкой?
wjandrea

Ответы:

17

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

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

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

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

Оли
источник
Это первое реальное понимание того, что делает / может делать экран ... спасибо за подсказку терминала ...
Peter.O
screen больше не доступен, но tmux может заменить экран. (tmux, чтобы начать новый сеанс tmux, ctrl + b, затем нажмите d, чтобы deatach, и tmux attach, чтобы присоединить)
Gman Smith
84

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

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

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

disown -hэто путь, если вы хотите сделать это с уже запущенной программой (то есть, если вы забыли об nohupэтом). Сначала вы должны остановить это с помощью Ctrl+ Z. Затем вы можете положить в фоновом режиме, используя bg [jobId](например bg 1). Вы получаете список запущенных заданий с их идентификатором 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
  • F12 Клавиша Escape экрана GNU
  • Alt-Pageup Прокрутите историю этого окна
  • Alt-Pagedown Прокрутите вперед историю этого окна
  • Ctrl-a-! Включить или выключить все сочетания клавиш Бёбу

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

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

echo './myprogram myoption1 myoption2' | at now

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

кон-е использование
источник
Совет: если есть только одно задание, идентификатор задания является необязательным, например, вместо того, чтобы bg %1вы могли просто напечатать bg.
MasterMastic
25

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

Это так, и часто это то, что вы хотите. Если вы забыли использовать &, вы можете приостановить программу с помощью 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 .

Сообщество
источник
Хорошо, спасибо ... Кажется, что ctrl-z(suspend) снова дает мне доступ к командной строке, но отключает графический интерфейс, пока я не выдам сообщение, bgкоторое, похоже, не приостанавливает его. (имеет смысл) ... Есть ли другая команда, с помощью которой я могу отсоединить графический интерфейс ... Ага! Теперь я понимаю, что вы подразумеваете под sighals (kill command)... (интересно эти сигналы) ... Я использовал фрагмент кода, чтобы ddпостепенно выводить его статистику ... и он использовал kill+ СИГНАЛ ... Есть ли специальный СИГНАЛ для отсоединения "задания" «?
Peter.O 31.10.10
Я только что заметил ваш комментарий к ответу Рика ... Я пробовал disown задания -p gedit`` и, похоже, он удалял задание .... (но я получал системные сообщения в Терминале, когда вручную закрывал gedit ... но я думаю, У меня сейчас
испорченный
@fred: Работа управляется оболочкой, поэтому ни один сигнал не может это контролировать. Вы можете обнаружить, что лучше всего запустить несколько оболочек - несколько терминалов с графическим интерфейсом позволяют вкладки, и вы можете использовать screen или tmux.
2
@fred: лучше не запускать, jobs -p commandесли в фоновом режиме одновременно выполняется несколько экземпляров одной команды. Вы можете использовать, jobsчтобы найти правильный идентификатор задания, а затем сделать, jobs -p <job-id>чтобы получить PID задания. Лично я нахожу версию с subshell намного проще. ;-)
htorque
2
@htorque, fred: Вы можете запустить disown без параметров, чтобы bash отменил последнюю работу:gedit & disown
22

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

firefox &!
стог
источник
6
Полезно знать, но это, кажется, только для zsh. В bash вам придется запускать вручную disown <pid-of-command>после запуска команды в фоновом режиме.
htorque
Интересно ... Я собираюсь заглянуть в zsh, но, как новичок в Linux, сейчас я буду придерживаться bash ... Спасибо
Peter.O
что делает восклицательный знак?
сумасшедший о Natty
1
! прервет процесс приложения из процесса терминала, так что вы сможете закрыть терминал без закрытия приложения, которое было запущено. Вроде бы что-то типа зш, но удобно.
Рик
Но это тоже сработало в bash @htorque .... Так что, думаю, это не проблема.
Jasser
20

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

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

Например:

nohup gedit something
Флориан Диш
источник
2
Что такое nohup? Пожалуйста, дополните.
Oxwivi
3
nohup - это программа, которая запускает данную команду с игнорируемыми сигналами зависания, поэтому команда может продолжить работу в фоновом режиме после завершения родительского процесса. Смотрите man-
страницу
На самом деле я думаю, что мой ответ здесь неверен. Если подумать дальше, nohupследует использовать этот сценарий.
Boehj
2
Когда интерактивная оболочка получает сигнал SIGHUP, может отправлять (или нет, в зависимости от настроек) сигнал SIGHUP всем своим дочерним элементам. Это может произойти (или нет, опять же), когда терминал закрыт. Ребенок, не готовый обработать такой сигнал, выполнит действие по умолчанию, то есть выйдет. nohupПриложение (и disownБаш встроенный) не позволяют сигналу достичь приложения.
энзотиб
2
Остерегайтесь одной вещи, которая nohupсоздает файл в текущем каталоге с именем nohup.out. Смотрите man-страницу для более подробной информации. Я предпочитаю disownпо этой причине и за то, что disownработает после запуска gedit.
Flimm
4

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

RobinJ
источник
Что такое экран GNU?
Oxwivi
Если я правильно понял, это своего рода оконный менеджер для командной строки. Это позволяет вам запускать более одной программы одновременно в сеансе интерфейса командной строки.
RobinJ
Бёб?
Oxwivi
Как-то так, только Byobu проще в использовании. Если я не ошибаюсь, Byobu - более простой интерфейс для GNU Screen.
RobinJ
1

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

$ (nohup gedit 2>/dev/null &)
wesleycoder
источник
1

XDG открыть

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

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

 $ xdg-open .

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

 $ xdg-open foo.pdf

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

$ xdg-open www.google.com
Джонатан Комар
источник
0

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

nohup gedit & exit

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

Локеш Девнани
источник
0

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

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
Сэм
источник
0

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

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
Эяль Левин
источник