커맨드 라인에서 GUI 리눅스 프로그램을 시작하는 방법, 커맨드 라인과는 어떻게 분리합니까?


89

나는 이것을 전에 검색했지만 답을 찾지 못했습니다.

Windows에서 콘솔 창이 열려 있으면을 입력 winmine하고 Enter 키를 누르면 cmd 프로그램과 완전히 분리 된 지뢰 찾기가 나타납니다. Minesweeper의 부모가 명령 프롬프트의 해당 인스턴스로 설정되는 것을 제외하고 Minesweeper 인스턴스는 내가 아는 방식으로 명령 프롬프트에 연결되어 있지 않습니다. 그러나 Linux에서는 다릅니다.

Linux에서 콘솔 창이 열려 있으면 입력 emacs하고 Enter 키를 누르면 Emacs가 열리지 만 명령 줄에 묶여있는 것 같습니다. 특히, Emacs 인스턴스가 닫힐 때까지 더 이상 명령 줄을 사용할 수없는 것 같습니다. Linux에서 Windows 동작을 복제 할 수있는 방법이 있습니까?

감사!



geekosaur에게 답을주십시오.
Joshua Robison

Windows7의에서 여기에 C minesweeper.exe 것 : 디렉토리 경로에없는 것처럼 .. .. \ 프로그램 Files \ Microsoft 게임 \ 지뢰 찾기가 너무 minesweeper.exe는 일반적으로 작동하지 않습니다를 그리고 어쨌든, 당신은 윈도우 버전을 명시해야
barlop

답변:


10

에서 bash, detach다음과 같이 사용되는 내장이있다 :

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

zsh, 당신은 배경 수 있고 한 번의 작업으로 분리 :

emacs &|

108

&명령 행에 추가 하십시오.

emacs &

그러면 이맥스가 백그라운드에 놓이고 터미널을 계속 사용할 수 있습니다.

이것은 여전히 ​​emacs를 터미널의 하위 프로세스로 남겨두고 터미널을 종료하면 emacs도 종료됩니다. 이를 피하려면 다음을 입력하십시오.

(emacs &)

괄호는 터미널에서 emacs 프로세스를 분리하도록 터미널에 지시합니다.

그래도 프로그램의 stdout 및 stderr 메시지가 터미널에 표시됩니다. 이를 방지하려면 다음을 사용하십시오.

(emacs &> /dev/null &)

9
나는 특히 (emacs &) 팁을 좋아합니다.

1
이미 작업을 시작한 경우 (emancs) CTRL-Z를 사용하여 절전 모드로 전환 한 다음 "bg"명령을 사용하여 백그라운드로 전송하십시오.
Jayan

@StackTrace : 그렇게하면 터미널을 닫으면 emacs도 종료됩니다.
Nathan Fellman

1
OK .. 나는 "nohup"을 사용하여 이것을 분리했다. 일단 프로세스가 시작되면 할 수 없습니다 ...
Jayan

누르면 Ctrl+를 C이 명령이 실행 된 터미널 창에서 프로세스가 살해 : <
리처드 드 위트

21

사용하십시오 nohup. 이처럼 :nohup amarok &

도움이 되었기를 바랍니다.


19

다양한 출처의 답변으로 비슷한 주제의 오래된 스레드 에 대한 답변 을 게시 했습니다 . 다음은이 글에 적합한 답변의 사본입니다.


다음 작품 :

$ (gui_app &> /dev/null &)

이것은 Nathan Fellman의 답변과 방향 전환입니다.

"&> / dev / null"은 stdout과 stderr을 모두 널 장치로 리디렉션합니다. 마지막 앰퍼샌드는 프로세스를 백그라운드에서 실행합니다. 명령을 괄호로 묶으면 "gui_app"가 서브 쉘에서 실행됩니다.

이렇게하면이 명령을 실행하는 콘솔에서 "gui_app"프로세스가 분리됩니다. 따라서 부모 터미널 에뮬레이터가 실행중인 창을 닫아도 "gui_app"는 닫히지 않습니다. 이것을 실행 한 다음 "pstree"명령을 사용하여 프로세스 트리를보고 이런 방식으로 시작된 응용 프로그램이 "init"에 대한 자식 프로세스가된다는 것을 알았습니다.

예를 들어

$ gui_app &> /dev/null &

애플리케이션은 백그라운드에서 실행되지만 콘솔 프로세스의 하위 프로세스가되고 터미널을 닫으면 종료됩니다. (종료 명령 또는 Ctrl-D를 사용하여 bash를 통해 터미널을 종료해도 백그라운드 프로세스를 초기화하여 bash를 정리할 수 있습니다.)

"nohup"은 NawaMan이 제안한대로 작동하지만 기본적으로 출력 및 오류를 파일로 리디렉션합니다. JeffG가 답변했듯이 백그라운드 프로세스를 시작한 후 "disown"명령 (쉘에서 사용 가능한 경우)이 터미널에서 프로세스를 분리 할 수 ​​있습니다.

$ gui_app &
$ disown

(이 모든 것이 bash에 적용됩니다. 다른 쉘에는이를 수행하는 다른 방법 / 구문이 있다고 확신합니다.)

일부 참조 : 프로세스 폐기 (UNIX Power Tools)

복잡한 옵션이없는 GUI 응용 프로그램을 간단하게 호출하는 경우 "gmrun"또는 dmenu (경고 : 큰 소리의 오디오) 와 같은 실행기를 사용하는 것도 좋은 옵션입니다. 키 조합에 바인딩하십시오. 아직 런처를 사용하지 않지만 두 가지를 시도했습니다.

참고 : CarlF 는 다른 스레드 보고서 의 주석에서 "gui_app &"메소드를 통해 시작된 GUI 앱이 상위 터미널을 종료 할 때 닫히지 않습니다. 우리는 다른 방식으로 터미널을 닫고 있다고 생각합니다. 터미널 에뮬레이터가 실행중인 창을 닫고있었습니다. 쉘 (exit 명령 또는 Ctrl-D)을 통해 터미널 에뮬레이터를 종료 한 것 같습니다. 나는 이것을 테스트하고 bash를 통해 나가는 것이 CarlF가 말한 것처럼 터미널의 백그라운드 프로세스로 시작된 GUI를 멈추지 않는다는 것을 알았습니다. bash는 백그라운드 프로세스를 정리하여 정리할 기회가 주어지면 초기화하는 것으로 보입니다. 실제로 이것은 서브 쉘에서 시작된 백그라운드 프로세스가 초기화되도록하는 메커니즘이어야합니다.


11

util-linux에는 기본적으로 detach 기능을 수행하는 setsid라는 도구가 포함되어 있습니다.

$ setsid someprogram

someprogram새 세션에서 실행 됩니다.


9

xemacs &배경에서 XEmacs를 열려면 입력하십시오 .

이것을 "Windows 동작 모방"이라고 언급하지 마십시오. 아야.

당신은 또한 할 수 있습니다 :

  • 새 터미널을여십시오
  • 터미널을 사용하는 대신 Alt + F2 또는 창 관리자를 사용하여 프로그램을 시작하십시오.
  • GNU 화면 사용

7

"silent background"에 대해 "sbg"라는 실행 가능한 스크립트 파일에 다음 코드를 넣었습니다. 쉘에서 시작되는 프로그램을 완전히 분리하는 데 필요한 모든 작업을 수행 /dev/null합니다.

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

그럼 당신은 할 수 있습니다 sbg emacs. 원하는 인수를 전달할 수도 있습니다 sbg emacs --daemon FILE1 FILE2..


스크립팅 솔루션이 가장 효과적이었습니다. 감사!! 내가 (gui_app &> /dev/null &)대신 사용했지만 (@EMPraptor의 답변)
Jimi Oke


3

bash를 사용하는 경우 프로세스를 제거 할 수 있습니다.

% firefox &
% disown 


1

다른 답변에서 알 수 있듯이 다음을 사용할 수 있습니다.

$ emacs &

그래도 잊어 버린 경우을 &누르고 Ctrl-z다음을 사용하십시오 bg.

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

참고 : Ctrl-zemacs 프로세스를 중지 bg하고 백그라운드로 보냅니다.


0

터미널에 연결된 프로세스를 그대로 사용 &하면 http://inglorion.net/software/detach/$ x & 라는 작은 프로그램을 선택했습니다.이 프로그램 은 약간 비슷 하지만 별명을가 했지만 로그 파일 뒤에 남지 않습니다. mupdf 를 분리하는 데 사용하십시오 :detach dnohupd 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 신호 때문이다.

추신 : 이제 winmineLinux를 사용할 준비가되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.