Як чисто запустити додаток 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.