Как правильно запустить приложение с графическим интерфейсом через Терминал?
Некоторые приложения с графическим интерфейсом запускаются корректно через командную строку терминала, но некоторые - нет, и они заставляют терминал ждать завершения приложения. Даже тогда некоторые не "выпускают" командную строку.
Таинственный амперсанд &
суффикс, кажется, заставляет терминал переводить процесс в фоновый режим (но я не уверен, что там происходит).
Есть ли способ запустить приложение через Терминал, чтобы не было эффекта "зависания", как запуск чего-либо через Alt+F2?
Мне бы хотелось, чтобы снова была доступна командная строка, без чего-либо еще в фоновом режиме и печати в терминале.
11 ответов
В случае с Гедитом, я просто постоянно держу копию открытой. Пока у вас есть работающая копия, запуск gedit
звонки с терминала и последующее закрытие терминала не убьют gedit.
Что касается других вещей, то, что сказали другие люди, тоже подойдет. Я фанат nohup
... Но если вам нужен терминал, который вы можете отсоединить, а затем снова подключить, вы хотите посмотреть на screen
,
- Запустите его в терминале, а затем запустите что-то, что продолжает выводить данные. Я использую сервер разработки Django, но
irssi
или дажеwatch uptime
были бы хорошими примерами. - Убейте терминал и начните новый.
- Бежать
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. Но 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