Как очистить приложение GUI через терминал?

71

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

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

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

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

    
задан Peter.O 31.10.2010 в 11:50
источник

10 ответов

17

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

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

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

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

    
ответ дан Oli 31.05.2011 в 14:25
источник
79

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

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

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

disown -h - это путь, если вы хотите сделать это с уже запущенной программой (т. е. если вы забыли nohup it). Сначала вам нужно остановить его, используя Ctrl + Z . Затем вы можете ввести запятую в 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 & . Вы хотите перенаправить вывод, чтобы он не был раздражен им или использовать его позже. Нулевой ввод может помочь предотвратить hickups в ssh и такой.

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

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

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

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

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

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

Полезное:

  • 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 Ключ выхода экрана GNU
  • Alt-Pageup Прокрутите страницу истории этого окна
  • Alt-Pagedown Прокрутите страницу вперед по истории этого окна
  • Ctrl-a -! Включение и отключение всех привязок Byobu.

Демон 'at' и другие

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

echo './myprogram myoption1 myoption2' | at now

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

    
ответ дан con-f-use 31.05.2011 в 14:28
25

The mysterious ampersand "&" suffix, seems to cause the terminal to put the process into the background... (but I'm not sure what happens there).

Он делает, и часто то, что вы хотите. Если вы забыли использовать & amp ;, вы можете приостановить программу с помощью 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" "[email protected]" &  # [email protected] is all args

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

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

    
ответ дан Roger Pate 31.10.2010 в 12:25
20

Использовать nohup

nohup is a program that runs a given command with hangup signals ignored, so that the command can continue running in the background after its parent process terminates. See the manpage

Например:

nohup gedit something
    
ответ дан Florian Diesch 31.05.2011 в 14:10
18

Чтобы запустить приложение и отсоединить его от используемого терминального терминала & amp;!

firefox &!
    
ответ дан Rick 31.10.2010 в 13:20
4

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

    
ответ дан RobinJ 31.05.2011 в 17:00
1

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

$ (nohup gedit 2>/dev/null &)
    
ответ дан wesleycoder 31.12.2012 в 00:20
0

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

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
    
ответ дан Eyal Levin 13.06.2018 в 10:43
0

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

nohup gedit & exit

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

    
ответ дан Lokesh Devnani 03.09.2015 в 19:25
0

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

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
    
ответ дан Sam 02.01.2018 в 20:40