때로는 프로세스를 시작하고 잊어 버리고 싶습니다. 다음과 같이 명령 행에서 시작하면 :
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에 의해 게시되었지만 이것이 조금 더 명확해질 수 있다고 생각합니다.
터미널 종료시 프로세스가 종료되는 이유는 시작 프로세스가 터미널의 하위 프로세스이기 때문입니다. 터미널을 닫으면 이러한 하위 프로세스도 종료됩니다. pstree
예를 들어 kate &
Konsole에서 실행할 때 프로세스 트리를 볼 수 있습니다 .
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
화면에 가상 터미널을 설정하는 프로그램 을 사용 하는 것입니다.
로 시작하는 것을 고려할 수 있습니다 . 거의 모든 Linux 및 Unix 파생 제품에 화면을 설치할 수 있습니다. 타격 + 및 (소문자하는) 두 번째 세션을 시작할 것이다. 이것은 당신이 타격에 의해 앞뒤로 초기 세션 사이를 전환 할 수있는 것이다 + 및 타격하거나 새로운 세션을 +를 하고 . 한 터미널에서 최대 10 개의 세션을 가질 수 있습니다. 나는 직장에서 세션을 시작하고 집에 가서 작업 기계로 ssh 한 다음 호출했습니다 . 그러면 해당 원격 세션에 다시 연결됩니다.screen -S session_name
CtrlACCtrlA0CtrlA1screen -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