터미널을 닫아도 생존 할 수있는 명령을 어떻게 실행할 수 있습니까?


313

때로는 프로세스를 시작하고 잊어 버리고 싶습니다. 다음과 같이 명령 행에서 시작하면 :

redshift

터미널을 닫을 수 없거나 프로세스가 종료됩니다. 프로세스를 종료하지 않고 터미널을 닫을 수있는 방식으로 명령을 실행할 수 있습니까?


4
모든 배포판에 기본 설치는 아니지만 화면은 친구입니다. en.wikipedia.org/wiki/GNU_Screen
Zayne S Halsall

같은 문제에 직면 한 사람에게 : 입력 yourExecutable &하고 출력이 화면에 계속 Ctrl+C나타나고 아무것도 멈추지 않는 것처럼 보이지만 화면이 출력으로 스크롤 되어도 맹목적으로 입력 disown;하고 누르십시오. Enter입력하고 있습니다. 프로세스가 폐기되고 프로세스가 종료되지 않고 터미널을 닫을 수 있습니다.
Nav

tmux 와 같은 화면 멀티플렉서를 사용할 수 있습니다 . 우분투 머신에서 apt-get을 통해 사용 가능
Himanshu

답변:


311

다음 2 개 중 하나가 작동해야합니다.

$ nohup redshift &

또는

$ redshift &
$ disown

작동 방식에 대한 자세한 내용은 다음을 참조하십시오.


5
두 번째 것은 redshift & disown우분투 10.10에서 나를 위해 일했습니다. 한 줄에 모두 넣으면 잘 작동하는 것 같습니다. 내가 이것을해서는 안되는 이유가 있습니까?
Matthew

4
@Matthew 첫 번째도 잘 작동해야합니다. 두 번째와 같이 배경이 아닙니다 (배경을 원할 수도 있습니다 nohup redshift &). 그리고 일반적으로 ;( redshift &; disown)
Michael Mrozek

10
@Michael : ;&명령 구분 기호이며 우선 순위가 같습니다. 유일한 차이점은 동기 실행과 비동기 실행 (각각)입니다. &;선호하는 것만 으로 사용할 필요는 없습니다 &(작동하지만 약간 중복됩니다).
Chris Johnsen

4
좋은 대답은 터미널이 디버그 출력으로 스팸되지 않도록 stdout 및 stderr을 리디렉션하는 것이 좋습니다.
Kim

12
또한 redshift &!적색 편이 즉시 사라집니다.

143

프로그램이 경우 이미 실행 당신은 그것을 일시 중지 할 수 있습니다 Ctrl-Z, 함께 배경으로 당겨 bg다음과 disown같이 그것을 :

$ sleep 1000
^Z
[1]+  Stopped                 sleep 1000
$ bg
$ disown
$ exit

3
폐기 후 실행중인 프로세스의 stdout을 어떻게 다시 읽을 수 있습니까?
Necktwi


1
이것은 어떤 이유로 든 나를 위해 작동하지 않았습니다 (centos)
Ian

이 절차 후에 프로세스를 종료하는 방법은 무엇입니까?
Palak Darji

2
@necktwi disown는 stdout 또는 stderr을 분리하지 않습니다. 그러나 (표준 연결 끊기) nohup와 마찬가지로 >/dev/null(연결 끊기 2>/dev/null오류). disown작업 제어를 해제합니다 ( ).
ctrl-alt-delor

45

좋은 대답은 이미 @StevenD에 의해 게시되었지만 이것이 조금 더 명확해질 수 있다고 생각합니다.

터미널 종료시 프로세스가 종료되는 이유는 시작 프로세스가 터미널의 하위 프로세스이기 때문입니다. 터미널을 닫으면 이러한 하위 프로세스도 종료됩니다. pstree예를 들어 kate &Konsole에서 실행할 때 프로세스 트리를 볼 수 있습니다 .

init-+
     ├─konsole─┬─bash─┬─kate───2*[{kate}]
     │         │      └─pstree
     │         └─2*[{konsole}]

종료시 kate프로세스를 분리 하려면 다음 과 같이 명령을 사용 하십시오.konsolekonsolenohup

nohup kate &

닫은 후 konsole, pstree다음과 같이 표시됩니다

init-+
     |-kate---2*[{kate}]

그리고 kate살아남을 것입니다. :)

대안으로 screen/ tmux/를 사용 byobu하면 터미널과 독립적으로 셸을 계속 실행합니다.


disown 방법에 문제가있었습니다. 이것은 현재 나를 위해 노력하고 있으므로 공감합니다. 나는 또한 꼬리 -f nohup.out은을 할 수 있기 때문에이 같은 일이 일어나고 무슨 볼 수 있지만 내 세션이 실패에 대해 걱정하지합니다
이안

27

터미널에서 이와 같은 프로세스를 실행할 수 있습니다

setsid process

새 세션에서 프로그램이 실행됩니다. 설명 된대로 http://hanoo.org/index.php?article=run-program-in-new-session-linux


1
nohup에 비해 setsid의 장점은 무엇입니까?
itsbruce

1
1)에 대한 성가신 메시지를 인쇄하지 않습니다 nohup.out. 2) 쉘의 작업 목록에 남아 있지 않으므로의 출력을 어지럽히 지 않습니다 jobs.
Mikel

이것은 lxterminal에서 실행되고 pcmanfm을 시작한 후 종료하는 스크립트에서 작동하는 유일한 솔루션입니다 (setsid를 사용하면 pcmanfm이 계속 실행되는 동안 터미널을 닫을 수 있음). 정말 고맙습니다!
desgua

9

모든 제안이 잘 작동하지만 대안은 screen화면에 가상 터미널을 설정하는 프로그램 을 사용 하는 것입니다.

로 시작하는 것을 고려할 수 있습니다 . 거의 모든 Linux 및 Unix 파생 제품에 화면을 설치할 수 있습니다. 타격 + 및 (소문자하는) 두 번째 세션을 시작할 것이다. 이것은 당신이 타격에 의해 앞뒤로 초기 세션 사이를 전환 할 수있는 것이다 + 및 타격하거나 새로운 세션을 +를 하고 . 한 터미널에서 최대 10 개의 세션을 가질 수 있습니다. 나는 직장에서 세션을 시작하고 집에 가서 작업 기계로 ssh 한 다음 호출했습니다 . 그러면 해당 원격 세션에 다시 연결됩니다.screen -S session_nameCtrlACCtrlA0CtrlA1screen -d -R session_name


screen -d -m command: 이미 분리 된 화면 내에서 시작됩니다 ~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x .... 당신은에있어.
박사 알렉산더

7

이 모든 것을 수행하는 쉘 전용 방법은 stdin을 닫고 명령을 백그라운드로 지정하는 것입니다.

command <&- & 

그런 다음 쉘을 종료 할 때 종료되지 않습니다. stdout을 리디렉션하는 것은 좋은 선택 사항입니다.

단점은 당신이 사실 후에 이것을 할 수 없다는 것입니다.


우분투에서 시도했습니다. 킬링 터미널도 시작된 프로세스를 종료했습니다. 이것이 왜 그런지에 대한 아이디어가 있습니까?
Ashok Koyi

7

다음과 같은 스크립트가 있습니다.

  • 백그라운드에서 임의의 명령을 실행

  • 터미널 창으로 죽지 않기

  • 그들의 출력을 억제

  • 종료 상태 처리

나는 주로 사용 gedit, evince, inkscape모든 성가신 터미널 출력을 많이 가질 수 등. 명령이 이전 TIMEOUT에 완료 되면 nohup의 종료 상태가 0 대신 반환됩니다.

#!/bin/bash

TIMEOUT=0.1

#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
nohup "${@}" >/dev/null 2>&1 &
NOHUP_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

예 ...

>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail

6

나는 선호한다:

(applicationName &)

예를 들면 다음과 같습니다. linux@linux-desktop:~$ (chromium-browser &)

명령을 입력 할 때 괄호를 사용해야합니다!


1
터미널을 닫으면 프로세스가
중단

아마도 괄호없이 내 대답에 사용한 프롬프트 명령이있을 것입니다. 터미널을 닫으면 프로세스가 종료되고 그렇지 않으면 발생하지 않습니다. 명확하게하기 위해 위의 솔루션을 이미 편집했습니다.
daGo

나를 위해 일, tnx
noadev

왜 이것이 더 많은지지를 얻지 못하는지 궁금합니다. nohuptty 출력을 방지하고 실제로 출력을 파일로 리디렉션하고 싶었으므로 이것이 더 나은 해결책입니다.
redanimalwar

4

터미널 세션을 로그 아웃하고 닫을 때 HUP 신호를받지 않도록 프로세스 (PID)를 설정할 수 있습니다. 다음 명령을 사용하십시오.

nohup -p PID

3

apolinsky가 제공 한 답변 과 비슷하게 변형을 사용합니다 screen. 바닐라 명령은 다음과 같습니다

screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'

Ctrl ACtrl D간단한 경우 세션을 사용하여 연결을 끊었다가 다시 연결할 수 있습니다 screen -r. 나는이라는 스크립트에 싸여있다 session내에서 살고 PATH편리하게 액세스를위한 준비 :

#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
    echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
    exec screen -S "$1" bash -c "$@; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
    echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1

이것은 프로그램 연결을 끊으려는 것을 미리 알고있을 때만 작동합니다. 이미 실행중인 프로그램의 연결을 끊을 수 는 없습니다 .


2

이전에 게시 된 다른 답변과 마찬가지로 reptyr 덕분에 실행 화면을 회귀 적으로 사용하여 실행중인 프로세스를 전송 한 다음 터미널을 닫을 수 있습니다. 단계는이 게시물에 설명되어 있습니다. 취해야 할 단계는 다음과 같습니다.

  1. 프로세스 중단
  2. 백그라운드에서 프로세스를 재개
  3. 프로세스 제거
  4. 스크린 세션 시작
  5. 프로세스의 PID 찾기
  6. reptyr을 사용하여 프로세스를 인계하십시오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.