터미널을 닫아도 생존 할 수있는 명령을 어떻게 실행할 수 있습니까? 닫을 수 없거나 프로세스가 종료됩니다.

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

redshift

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



답변

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

$ nohup redshift &

또는

$ redshift &
$ disown

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


답변

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

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


답변

좋은 대답은 이미 @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하면 터미널과 독립적으로 셸을 계속 실행합니다.


답변

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

setsid process

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


답변

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

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


답변

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

command <&- &

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

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


답변

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

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

  • 터미널 창으로 죽지 않기

  • 그들의 출력을 억제

  • 종료 상태 처리

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