터미널을 통해 GUI 앱을 깨끗하게 시작하는 방법은 무엇입니까?


78

일부 GUI 앱은 터미널 명령 줄을 통해 깨끗하게 시작되지만 일부는 그렇지 않으며 터미널이 앱이 종료 될 때까지 대기합니다. 그럼에도 불구하고 일부는 명령 행을 "해제"하지 않습니다.

신비한 앰퍼샌드 &접미어는 터미널이 프로세스를 백그라운드로 넣는 것처럼 보이지만 (어떻게 일어날 지 잘 모르겠습니다).

Alt+ 를 통해 무언가를 시작하는 것처럼 "hang on"효과가 없도록 터미널을 통해 앱을 시작하는 방법이 F2있습니까?

백그라운드에 여전히 무언가가 있고 터미널에서 인쇄하지 않고 명령 줄을 즉시 다시 사용할 수 있기를 원합니다.


htorque의 요청에 따라 귀하가 수락 한 답변을 삭제했습니다. 다른 답변을 고를 수 있습니까? (토론의 첫 번째를 선택 취소해야합니다-페이지 하단에 빨간색으로 숨겨져 있어야 함)
Oli

1
이 방법은 처리하는 프로그램-이미 실행중인 (사기꾼-F-사용에 의해 설명 된대로)이 그 상황에 대한 좋은,하지만 내 주요 질문에 대한이었다으로 어떤 터미널 혼란과 청소 시작 , 내가 수락 screen(OLI 언급 및 RobinJ). 나는 그 기능에 깊은 인상을 받았다. 그것에 대해 읽고 그것을 밖으로 시도 후 ... 그것은 단지의 입력이 필요합니다 screen -d -m gedit(또는 screen gedit다음 Ctrl+a d분리) ... 그리고 나는 아직도를 통해 언제든지 (메시지 등 경고 용)의 gedit의 터미널 뷰에 대한 전체 액세스 권한이 screen -r경우에도 I 그동안 원래 터미널 창을 닫았습니다 ...
Peter.O

BTW, 터미널에 기여하고있는 것들 중 일부는 실제로 쉘에 의해 수행됩니다 (예 : &명령 접미사 해석) . 이는 설명에 도움이 될 수 있습니다. 터미널, 콘솔, 셸 및 명령 줄의 차이점은 무엇입니까?
wjandrea

답변:


17

gedit의 경우 사본을 항상 열어 둡니다. 기존 사본이 실행 중이 gedit면 터미널에서 전화를 시작한 다음 터미널을 닫아도 gedit가 종료되지 않습니다.

다른 사람들은 다른 사람들이 말한 내용도 효과가있을 것입니다. 나는 팬입니다 nohup...하지만 터미널이 필요하다면 분리하고 다시 연결할 수 있습니다 screen.

  1. 터미널에서 실행 한 다음 출력을 계속 유지하는 무언가를 실행하십시오. 나는 장고 개발 서버를 사용하지만 irssi, 심지어 watch uptime좋은 사례가 될 것입니다.
  2. 터미널을 종료하고 새 터미널을 시작하십시오.
  3. 실행 screen -r및 붐, 당신은 다시입니다.

screen그것보다 훨씬 크며 byobu더 나은 터미널 경험 을 위해 그것을 결합 할 수 있습니다. 주위를 읽어보십시오.


이것은 스크린이 무엇을하고 무엇을 할 수 있는지에 대한 최초의 실제 통찰력입니다 ... 터미널 팁 덕분에 ...
Peter.O

화면을 더 이상 사용할 수 없지만 tmux는 화면을 대체 할 수 있습니다. (tmux는 새로운 tmux 세션을 시작하려면 ctrl + b를 누른 다음 d를 눌러 분리하고 tmux는 reattach에 연결)
Gman Smith

84

gedit분리 된 상태로 실행하려는 프로그램 (일명 "Disowned", "disentangled", "decoupled")이 있다고 가정 합니다. 정확히하고 싶은 것에 따라 다른 방법이 있습니다 :

이미 실행중인 프로그램

자기 것이 아니라고 말하다:

disown -h이미 실행중인 프로그램으로 (예 : 잊어 버린 경우) 수행하려는 방법 nohup입니다. 먼저 Ctrl+ 사용하여 중지해야합니다 Z. 그런 다음 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에서 hickup을 방지하는 데 도움이 될 수 있습니다.

서브 쉘 :

당신은 비슷한 효과를 얻을 수 있습니다

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

대괄호는 gedit in을 실행하기 위해 새 서브 쉘을 엽니 다.이 명령 >/dev/null 2>&1은 쉘 출력을 아무 곳으로나 리디렉션합니다 (출력 억제). 그리고 &마지막에는 프로세스를 배경으로 만듭니다.

터미널 멀티플렉싱

또한 화면 또는 byobu를 사용한 터미널 멀티플렉싱 . 기본적으로 자체 터미널에서 프로그램을 실행합니다. 다른 이유로도 byobu를 추천 할 수 있습니다. 아래는 첫 번째 단계에서 유용 할 수있는 보이 부-바로 가기 목록입니다.

유능한:

  • 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'데몬 및 기타

at예정된 시간에 명령을 실행하는 유용한 작은 도구입니다. 쉘에서 명령을 분리하는 것은 '오용'될 수 있습니다.

echo './myprogram myoption1 myoption2' | at now

또한 setsidand 를 살펴볼 수 start-stop-daemon있지만 다른 방법으로 충분합니다.


팁 : 작업이 하나 뿐인 경우 작업 ID는 선택 사항입니다 (예 : 대신 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의 answer 과 같습니다 .


알았어, 고마워 ... ctrl-z(suspend) 명령 줄에 다시 액세스 할 수 bg있는 것처럼 보이지만 중단 할 것으로 보이지 않는 문제 가 발생할 때까지 GUI 를 비 웁니다. GUI를 분리 할 수있는 다른 명령이 있습니까? Aha! 난 당신이 무슨 뜻인지 지금은 볼 sighals (kill command)(흥미로운 일이 신호) .. 내가 할 수있는 코드를 사용 dd...이 통계 점진적으로 출력하고 사용 kill+ 신호 ...에 "작업을 분리하는 특정 신호가 있는가 "?
Peter.O

방금 Rick의 답변에 대한 귀하의 의견을 발견했습니다 ... 나는 disown job -p gedit을 시도했지만 작업을 제거하는 것처럼 보였습니다 .... (그러나 수동으로 gedit를 닫았을 때 터미널에 시스템 메시지가 나타납니다 ... 나는 지금 망쳐 놓은 터미널을 가지고 있습니다 ... 너무 많은 실험 :(
Peter.O

@fred : 작업은 쉘에 의해 관리되므로 신호를 제어 할 수 없습니다. 여러 셸을 시작하는 것이 가장 효과적 일 수 있습니다. 여러 GUI 터미널에서 탭을 허용하고 screen 또는 tmux를 사용할 수 있습니다.

2
@fred : jobs -p command한 번에 한 명령의 여러 인스턴스가 백그라운드에서 실행되는 경우 더 잘 실행되지 않습니다 . jobs올바른 작업 ID를 찾은 다음 jobs -p <job-id>작업의 PID를 얻는 데 사용할 수 있습니다 . 개인적으로 서브 쉘이있는 버전이 훨씬 더 쉽다는 것을 알게되었습니다. ;-)
htorque

2
@htorque, fred : 매개 변수없이 disown을 실행하여 bash가 마지막 작업을 disown하도록 할 수 있습니다.gedit & disown

22

응용 프로그램을 시작하고 시작된 터미널에서 분리하려면 &!를 사용하십시오.

firefox &!

6
알아두면 좋지만 zsh 전용 인 것 같습니다. bash에서는 disown <pid-of-command>백그라운드에서 명령을 시작한 후 수동으로 실행해야합니다 .
htorque

흥미
롭습니다

느낌표는 무엇을합니까?
natty에 대해 nutty

1
! 터미널 프로세스에서 응용 프로그램 프로세스를 중단하여 시작된 응용 프로그램을 닫지 않고 터미널을 닫을 수 있습니다. zsh 일 것 같지만 편리합니다.
Rick

그러나 이것은 bash에서도 @htorque에서 작동했습니다 .... 문제가되지 않습니다.
Jasser

20

사용하다 nohup

nohup은 끊기 신호를 무시하고 지정된 명령을 실행하는 프로그램으로, 부모 프로세스가 종료 된 후에도 명령이 백그라운드에서 계속 실행될 수 있습니다. 맨 페이지 참조

예를 들면 다음과 같습니다.

nohup gedit something

2
무엇입니까 nohup? 정교하게 작성하십시오.
Oxwivi

3
nohup은 행업 신호를 무시하고 지정된 명령을 실행하는 프로그램으로, 부모 프로세스가 종료 된 후 백그라운드에서 명령을 계속 실행할 수 있습니다. 맨 페이지
Florian Diesch 12

사실 나는 내 대답이 여기에 맞지 않다고 생각합니다. 추가로 생각하면 nohup이 시나리오에서 사용해야합니다.
boehj

2
대화식 쉘이 SIGHUP 신호를 수신하면 SIGHUP 신호를 모든 자식에게 보낼 수 있습니다 (설정에 따라 다름). 이것은 터미널이 닫힐 때 발생할 수 있습니다. 그러한 신호를 처리 할 준비가되지 않은 아이는 기본 동작, 즉 종료를 실행합니다. nohup응용 프로그램 (그리고 disownbash는 내장)는 신호가 응용 프로그램에 도달하는 것을 허용하지 않습니다.
enzotib

2
주의해야 할 것은 nohup현재 디렉토리에이라는 파일 을 만드는 것 nohup.out입니다. 자세한 내용은 매뉴얼 페이지 를 참조하십시오. disown이런 이유로, 그리고 disown당신이 시작한 후에 작동 하는 사실을 선호 합니다 gedit.
Flimm

4

터미널을 열고 screen 을 입력 한 후 실행하려는 명령을 입력하고 터미널을 닫으십시오. 프로그램은 GNU Screen 세션 에서 계속 실행되어야합니다 .


GNU Screen은 정확히 무엇입니까?
Oxwivi

아이디어를 올바르게 얻으면 명령 줄의 일종의 창 관리자입니다. 명령 행 인터페이스 세션에서 한 번에 둘 이상의 프로그램을 실행할 수 있습니다.
RobinJ

o 부?
Oxwivi

그런 것만으로는 Byobu 만 사용하기가 더 쉽습니다. 내가 틀렸다면 Byobu는 GNU Screen을위한 더 쉬운 인터페이스 일뿐입니다.
RobinJ


1

xdg-open

이 범용 유틸리티를 살펴보십시오 : 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은 여전히 ​​터미널에서 열려 있으며 자극적 인 터미널에서 프로그램 활동을 표시합니다. 그 후에는 터미널을 닫아서 피할 수 있습니다. 내가 사용하는 매우 간단한 해결 방법을 찾았습니다.

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