때로는 프로세스를 시작하고 잊어 버리고 싶습니다. 다음과 같이 명령 행에서 시작하면 :
redshift
터미널을 닫을 수 없거나 프로세스가 종료됩니다. 프로세스를 종료하지 않고 터미널을 닫을 수있는 방식으로 명령을 실행할 수 있습니까?
다음 2 개 중 하나가 작동해야합니다.
$ Nohup redshift &
또는
$ redshift &
$ disown
작동 방식에 대한 자세한 내용은 다음을 참조하십시오.
man Nohup
help disown
Nohup, disown 및 & 의 차이점 (댓글도 읽어보십시오)
프로그램이 이미 실행 중 인 경우 Ctrl-Z
, 다음과 같이 bg
를 사용하여 배경으로 가져간 다음 disown
$ sleep 1000
^Z
[1]+ Stopped sleep 1000
$ bg
$ disown
$ exit
좋은 답변은 이미 @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
를 사용하는 것인데, 터미널과 독립적으로 셸을 계속 실행합니다.
터미널에서 이와 같은 프로세스를 실행할 수 있습니다
setsid process
새 세션에서 프로그램이 실행됩니다. 설명 된대로 http://hanoo.org/index.php?article=run-program-in-new-session-linux
모든 제안이 잘 작동하지만 대안은 화면에 가상 터미널을 설정하는 screen
를 사용하는 것입니다.
screen -S session_name
로 시작하는 것을 고려할 수 있습니다. 거의 모든 Linux 및 Unix 파생 제품에 화면을 설치할 수 있습니다. 타격 Ctrl+A 그리고 (소문자) C 두 번째 세션을 시작합니다. 이것은 당신이 타격을하여 초기 세션 사이를왔다 갔다 할 수있게합니다 Ctrl+A 과 또는 새로운 세션을 쳐서 Ctrl+A 과 1. 한 터미널에서 최대 10 개의 세션을 가질 수 있습니다. 직장에서 세션을 시작하고 집에 가서 업무용 컴퓨터로 ssh 한 다음 screen -d -R session_name
를 호출했습니다. 그러면 해당 원격 세션에 다시 연결됩니다.
다음과 같은 스크립트가 있습니다.
나는 주로 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
이 모든 것을 수행하는 쉘 전용 방법은 stdin을 닫고 명령을 백그라운드로 지정하는 것입니다.
command <&- &
그런 다음 셸을 종료해도 종료되지 않습니다. stdout을 리디렉션하는 것은 좋은 선택 사항입니다.
단점은 당신이 사실 후에 이것을 할 수 없다는 것입니다.
터미널 세션을 로그 아웃하고 닫을 때 HUP 신호를받지 않도록 프로세스 (PID)를 설정할 수 있습니다. 다음 명령을 사용하십시오.
Nohup -p PID
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
이것은 프로그램 연결을 끊으려는 것을 미리 알고있을 때만 작동합니다. 이미 실행중인 프로그램의 연결을 끊을 수는 없습니다.