Як чисто запустити додаток GUI через термінал?


78

Деякі програми GUI запускаються чисто через командний рядок Terminal, а деякі ні, і вони змушують Термінал чекати, коли додаток закінчиться. Навіть тоді деякі не "відпускають" командний рядок.

Таємничий &суфікс ampersand, здається, спричиняє термінал, щоб перенести процес на другий план (але я не впевнений, що там відбувається).

Чи є спосіб запустити додаток через термінал, щоб не було ефекту "зависання", як запускати щось через Alt+ F2?

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


На прохання 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дзвінків з терміналу та закриття терміналу не вб'є gedit.

Для інших речей те, що сказали інші, теж працювало. Я фанат nohup... Але якщо вам потрібен термінал, який ви можете від'єднати, а потім знову приєднати, ви хочете подивитися screen.

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

screenнабагато більший за це, і ви можете комбінувати його з byobuкращим термінальним досвідом. Читайте навколо.


Це перше реальне уявлення про те, що робить / що може робити екран ... дякую за підказку терміналу ...
Peter.O

екран більше недоступний, але tmux може замінити екран. (tmux, щоб почати новий сеанс tmux, ctrl + b, потім натисніть d, щоб діатачити, і tmux приєднати, щоб повторно вкласти)
Gman Smith

84

Припустимо, geditце програма, яку ви хочете запустити окремо (т.к. "відключений", "роз'єднаний", "роз'єднаний"). Існують різні способи залежно від того, що саме ви хочете зробити:

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

Відхилено:

disown -hце шлях, якщо ви хочете зробити це за допомогою вже запущеної програми (тобто якщо ви забули про nohupнеї). Спочатку потрібно припинити це за допомогою Ctrl+ Z. Потім ви можете розмістити у фоновому режимі, використовуючи bg [jobId](наприклад bg 1). Ви отримуєте перелік запущених завдань із використанням їх ID-роботи jobs. Після цього ви можете від'єднати його від використання терміналу disown -h %[jobId]. Приклад термінального сеансу:

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

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

nohup

nohupне завжди присутній на всіх машинах. Якщо ви знаєте, що хочете заздалегідь роз’єднати, скористайтеся:

nohup gedit &

Може бути , ви хочете , щоб перенаправити висновок оболонки , а також і своїй програмі джерело вхідного сигналу псевдо, так: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Ви хочете перенаправити вихід, щоб він або не дратувався ним, або використовувати його пізніше. Null-input може допомогти запобігти hickups в ssh a.

Абонемент:

Подібного ефекту можна досягти шляхом

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

Дужки відкривають нову підзарядку для запуску gedit. >/dev/null 2>&1Перехід направляє оболонку в нікуди (пригнічуючи вихід). І &в кінці ставить процес на другий план.

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

Також термінальне мультиплексування за допомогою екрана або byobu . Ви в основному запускаєте програму у власному терміналі. Я також можу порекомендувати 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це хороший корисний маленький інструмент для запуску команди в запланований час. Вилучити команду з оболонки можна "неправильно":

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(призупинити) мені знову надають доступ до командного рядка, але пропускає графічний інтерфейс, поки я не видаю, bgщо, здається, не скасовує його. (має сенс) ... Чи є ще одна команда, за допомогою якої я можу від'єднати графічний інтерфейс ... Ага! Я бачу, що ви маєте на увазі під sighals (kill command)... (цікаво, ці сигнали) .. Я використав фрагмент коду, щоб ddпрогресивно виводити його статистику .. і він використовував kill+ SIGNAL ... Чи є специфічний SIGNAL для від'єднання "роботи" "?
Пітер.О

Я щойно помітив ваш коментар до відповіді Ріка ... Я спробував disown завдання -p gedit`` і, здається, видалити роботу .... (але я отримав системні повідомлення в Терміналі, коли я вручну закрив gedit ... але я думаю На даний момент у мене накручений термінал ... занадто багато експериментує :(
Peter.O

@fred: Завданнями керує оболонка, тому жоден сигнал не може це контролювати. Вам може здатися, що найкраще запускати кілька оболонок - кілька терміналів GUI дозволяють вкладки, а ви можете використовувати екран або tmux.

2
@fred: краще не запускатись, jobs -p commandякщо у вас одночасно працює кілька екземплярів однієї команди. ви можете використовувати jobsправильний ідентифікатор завдання, а потім зробити, jobs -p <job-id>щоб отримати PID завдання. Особисто я вважаю версію з передплатою набагато простішою. ;-)
htorque

2
@htorque, fred: Ви можете запустити відключення без параметрів, щоб баш відмовився від останнього завдання:gedit & disown

22

Щоб запустити програму та відірвати її від запущеного терміналу, використовуйте & !.

firefox &!

6
Добре знати, але це здається лише zsh. У bash вам доведеться вручну запускатись disown <pid-of-command>після запуску команди у фоновому режимі.
htorque

Цікаво ... Я збираюся заглянути в zsh, але як новачок у Linux, я зараз дотримуюся bash ... Дякую
Peter.O

що робить знак оклику?
горіх про natty

1
The! перерве процес подачі заявки з термінального процесу, так що ви можете закрити термінал без програми, яка була запущена із закриття. Здається, це zsh річ, але зручно.
Рік

Але це спрацювало і в баші @htorque .... Тож я думаю, це не проблема.
Джассер

20

Використовуйте nohup

nohup - це програма, яка виконує задану команду з ігнорованими сигналами підключення, щоб команда могла продовжувати працювати у фоновому режимі після того, як її батьківський процес закінчується. Див. Сторінку

Наприклад:

nohup gedit something

2
Що таке nohup? Будь ласка, докладно.
Oxwivi

3
nohup - це програма, яка виконує задану команду з ігнорованими сигналами підключення, щоб команда могла продовжувати працювати у фоновому режимі після того, як її батьківський процес закінчується. Дивіться довідкову сторінку
Флоріан Diesch

Насправді я думаю, що моя відповідь тут неправильна. Подальшу думку, nohupслід використовувати в цьому сценарії.
boehj

2
Коли інтерактивна оболонка отримує сигнал SIGHUP, може надсилати (або ні, залежно від налаштувань) сигнал SIGHUP усім своїм дітям. Це може статися (або знову ж таки), коли термінал закритий. Дитина, не готова обробити такий сигнал, виконає дію за замовчуванням, тобто вихід. nohupДодаток (і disownБаш вбудований) не дозволяють сигналу досягти додатки.
enzotib

2
Слід бути обережним - це nohupстворити файл у поточній папці під назвою nohup.out. Детальнішу інформацію див. На сторінці чоловіка . Я віддаю перевагу disownсаме тому і тому, що disownпрацює після запуску gedit.
Флейм

4

Відкрийте термінал, введіть екран , введіть команду, яку потрібно запустити, закрийте термінал. Програма повинна продовжувати працювати на екрані GNU Screen .


Що саме таке GNU Screen?
Oxwivi

Якщо я правильно зрозумів ідею, це своєрідний менеджер вікон для командного рядка. Це дозволяє запускати більше однієї програми одночасно в інтерфейсі командного рядка.
RobinJ

Бьобу?
Oxwivi

Щось подібне, тільки Byobu простіший у використанні. Якщо я npot помиляюся, Byobu - це просто простіший інтерфейс для GNU Screen.
RobinJ


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 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.