Як запустити програми linux GUI з командного рядка, але окремо від командного рядка?


89

Я шукав це раніше, але так і не зміг знайти відповідь.

Якщо у мене відкрито вікно консолі, введіть winmineі натисніть клавішу Enter, з'явиться Мінекоробник, повністю відокремлений від програми cmd. Екземпляр Minesweeper не пов'язаний з командним рядком жодним чином, про який я знаю, за винятком того, що батько Minesweeper встановлений для цього примірника командного рядка. Однак у Linux все інакше.

Якщо у мене відкрито вікно консолі, введіть emacsта натисніть клавішу Enter, Emacs відкриється, але це здається прив’язаним до командного рядка. Зокрема, видається, що я більше не можу використовувати командний рядок, поки цей екземпляр Emacs не закриється. Чи є спосіб повторити поведінку Windows в Linux?

Дякую!


1
дуб

будь ласка, дайте відповідь гекозавру.
Джошуа Робісон

у windows7 це minesweeper.exe C: \ Program Files \ Microsoft Games \ Minesweeper, так що minesweeper.exe, як правило, не працюватиме .. так як цей каталог не стоїть на шляху .. І як би там не було, слід вказати версію Windows
barlop

Відповіді:


10

В bash, detachє вбудований, використовуються таким чином :

emacs &
detach %+ # or % + the number in brackets printed after the above

У цьому режимі zshви можете фоновим зображенням та від'єднанням за одну операцію:

emacs &|

108

Додайте &до командного рядка:

emacs &

Це дозволить emacs у фоновому режимі та дасть можливість продовжувати користуватися терміналом.

Зауважте, що це все ще залишить emacs як підпроцес вашого терміналу, а коли ви вийдете з терміналу, він також вийде з emacs. Щоб цього уникнути, введіть:

(emacs &)

В дужках вказано терміналу від'єднати процес emacs від терміналу.

Все-таки повідомлення stdout та stderr з програми з’являться на терміналі. Щоб запобігти цьому, використовуйте:

(emacs &> /dev/null &)

9
Особливо мені подобається рада (emacs &).

1
якщо ви вже розпочали завдання (emancs), то використовуйте CTRL-Z, щоб увійти в режим сну, а потім скористайтеся командою "bg" для відправки на задній план.
Джаян

@StackTrace: якщо ви це зробите і закриєте свій термінал, це також вб'є emacs.
Натан Фелман

1
Добре .. Я раніше використовував "nohup" відривати це. Це неможливо зробити, як тільки процес запущений ...
Jayan

При натисканні клавіші Ctrl+ Cу вікні терміналу ця команда була видана, процес вбивається: <
Річард де Віт,

21

Використовуйте nohup. Подобається це:nohup amarok &

Сподіваюся, це допомагає.


19

Я розмістив відповідь на старішу тему подібної теми з відповідями з різних джерел. Далі йде копія відповіді, адаптована для цього потоку.


Наступні роботи:

$ (gui_app &> /dev/null &)

Це відповідь Натана Фелмана плюс перенаправлення.

"&> / dev / null" перенаправляє як stdout, так і stderr на нульовий пристрій. Остання амперсанда робить процес запущеним у фоновому режимі. Дужки навколо команди призведуть до запуску вашого "gui_app" в нижній частині.

Це призведе до від'єднання процесу "gui_app" з консолі, з якої виконується ця команда. Тож навіть якщо ви закриєте віконний емулятор батьківського терміналу, "gui_app" не закриється. Я запустив це, потім подивився на дерево процесу з командою "pstree" і виявив, що застосований таким чином додаток стане дочірнім процесом до "init".

Наприклад,

$ gui_app &> /dev/null &

запустить додаток у фоновому режимі, але він стане дочірнім процесом консольного процесу і закінчиться, коли ви закриєте термінал. (Хоча вихід із терміналу через bash за допомогою команди exit або Ctrl-D дозволить bash очиститись, передавши фоновий процес на init.)

"nohup" працює так, як запропонував NawaMan, але перенаправляє вихід і помилку до файлу за замовчуванням. Як відповів JeffG, команда "відключити" (якщо вона доступна в оболонці) може від'єднати процес від терміналу після того, як ви розпочали фоновий процес:

$ gui_app &
$ disown

(BTW все це стосується bash. Я впевнений, що інші оболонки мають інші методи / синтаксис для цього.)

Деякі посилання: Розкриття процесів (електроінструменти UNIX)

Якщо це простий дзвінок на додаток для графічного інтерфейсу - без складних варіантів і подібного - здається, що використання пускового пристрою типу "gmrun" або dmenu (попередження: гучне звучання) також є хорошим варіантом. Прив’яжіть до ключової комбінації. Я ще не використовую пусковий апарат, але спробував ці два.

ПРИМІТКА: CarlF у коментарях інших звітів про потоки додатків GUI, запущених методом "gui_app &", не закривається, коли він виходить з батьківського терміналу. Я думаю, що ми закривали термінал різними способами. Я закривав вікно, в якому запускався емулятор терміналу. Я думаю, що він, можливо, виходив з емулятора терміналу через оболонку (команда виходу або Ctrl-D). Я перевірив це і побачив, що вихід через bash не зупиняє GUI, розпочатий як фоновий процес терміналу, як каже CarlF. Здається, що баш руками від фонових процесів ініціює, коли йому надається можливість очистити. Насправді, це повинен бути механізм, за допомогою якого фоновий процес, розпочатий у нижній частині, передається в init.


11

util-linux включає інструмент під назвою setid, який в основному робить те, що робить detach:

$ setsid someprogram

Це буде запущено someprogramв новому сеансі.


9

Спробуйте ввести, xemacs &щоб відкрити XEmacs у фоновому режимі.

Будь ласка, не посилайтеся на це як на "емуляцію поведінки Windows". Ой.

Ви також можете:

  • Відкрийте новий термінал
  • Використовуйте Alt + F2 або менеджер вікон для запуску програми, а не терміналу
  • Використовуйте екран GNU

7

Я поклав наступний код у виконуваний файл сценарію під назвою "sbg" для "безшумного фону". Він робить усі необхідні речі для повного відключення запущеної програми від оболонки: перенаправляє stdin, stdout та stderr з / до /dev/null, ігнорує зависання, працює у фоновому режимі та відриває.

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

Тоді можна просто зробити sbg emacs. Ви також можете передавати будь-які аргументи , які ви хочете: sbg emacs --daemon FILE1 FILE2.


сценарій рішення працював найкраще для мене. Дякую!! хоча я використовував (gui_app &> /dev/null &)замість цього (@ відповідь EMPraptor)
Джимі Оке


3

якщо ви використовуєте bash, ви можете відхилити процес:

% firefox &
% disown 


1

Як говорять інші відповіді, ви можете використовувати наступне:

$ emacs &

Якщо ви все ж забули &, просто натисніть, Ctrl-zа потім скористайтесь bg:

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

FYI: Ctrl-zзупиняє процес emacs і bgнадсилає на задній план.


0

просто використовуючи, &як $ x &залишає процес, приєднаний до терміналу, я підняв невелику програму під назвою detach http://inglorion.net/software/detach/, яку я відчув, як dце трохи схоже, nohupале не залишає після себе файл журналу i використовувати його для від'єднання mupdf :d mupdf x.pdf


0

Покладіть це до свого ~/.bashrc:

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

Тепер вам не потрібно пам’ятати, які програми є X11, і робити спеціальні маніпуляції з ними, оскільки вони автоматично відключаються. Зауважте, що setsidце краще, ніж nohupтому, що останній блокує сигнал HUP, який не є тим, що вам потрібно.

PS Тепер ви вже winmineв Linux.

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