it-swarm-ko.tech

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

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

redshift

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

339
Matthew

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

$ Nohup redshift &

또는

$ redshift &
$ disown

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

342
Steven D

프로그램이 이미 실행 중 인 경우 Ctrl-Z, 다음과 같이 bg를 사용하여 배경으로 가져간 다음 disown

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

좋은 답변은 이미 @StevenD에 의해 게시되었지만, 좀 더 명확히 할 수 있다고 생각합니다.

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

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

kate를 종료 할 때 konsole 프로세스를 konsole에서 분리하려면 다음과 같이 Nohup 명령을 사용하십시오.

Nohup kate &

konsole을 (를) 닫으면 pstree는 다음과 같습니다.

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

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

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

50
gertvdijk

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

setsid process

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

31
hanoo

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

screen -S session_name로 시작하는 것을 고려할 수 있습니다. 거의 모든 Linux 및 Unix 파생 제품에 화면을 설치할 수 있습니다. 타격 Ctrl+A 그리고 (소문자) C 두 번째 세션을 시작합니다. 이것은 당신이 타격을하여 초기 세션 사이를왔다 갔다 할 수있게합니다 Ctrl+A 과  또는 새로운 세션을 쳐서 Ctrl+A 과 1. 한 터미널에서 최대 10 개의 세션을 가질 수 있습니다. 직장에서 세션을 시작하고 집에 가서 업무용 컴퓨터로 ssh 한 다음 screen -d -R session_name를 호출했습니다. 그러면 해당 원격 세션에 다시 연결됩니다.

10
apolinsky

나는 선호한다:

(신청 명 및)

예를 들면 다음과 같습니다. [email protected]:~$ (chromium-browser &)

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

8
daGo

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

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

  • 터미널 창으로 죽지 않기

  • 그들의 출력을 억제

  • 종료 상태 처리

나는 주로 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
7
jozxyqk

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

command <&- & 

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

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

7
w00t

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

Nohup -p PID
4
tony

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 "[email protected]; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
    echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1

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

3
roaima

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

  1. 프로세스 중단
  2. 백그라운드에서 프로세스를 재개
  3. 프로세스 제거
  4. 스크린 세션 시작
  5. 프로세스의 PID 찾기
  6. Reptyr을 사용하여 프로세스를 인계하십시오
2
user308879