로컬로든 SSH를 통해든 Xubuntu 16.04에서 이 네 가지 명령을 실행하면 모두 똑같은 작업을 수행하는 것 같습니다.
export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
gedit &
gedit & disown
nohup gedit
nohup gedit & disown
gedit &
gedit & disown
상위 터미널을 종료하거나 SSH 세션에서 로그아웃하면 두 경우 모두 gedit가 "거부"되기 때문에 gedit와 gedit의 차이점을 이해하지 못합니다 .
두 번째와 세 번째의 경우, 내가 본 유일한 차이점은 명령 출력이 별도의 파일에 기록되고 bg 프로세스를 생성한 원래 셸 세션이 종료된 경우에도 해당 별도의 로그에 계속 기록된다는 것입니다.
3개와 4개의 경우 기술적인 차이가 있다는 글을 항상 읽었지만 왜 둘 중 하나를 더 선호하는지 전혀 모르겠습니다.
어느 것을 사용해야 합니까?튜토리얼과 Q&A에서 사용된 네 가지 명령을 모두 보았고 nohup과 disown의 기술적 차이점을 설명하는 매우 좋은 답변이 있지만 명확한 권장 사항을 얻을 수 없는 것 같습니다(로깅 목적이나 쉘 호환성 외에는) ) 사용해야겠어요.
답변1
잠시 동안 실행될 스크립트를 실행해야 할 때장기, 회의 중입니다 ssh
. 원하는 것은 다음과 같습니다.
네트워크가 다운되거나 노트북을 챙겨 떠나더라도 작업은 계속되어야 합니다.
ㅏ. 이 작업은 나의 대화형 입력 없이 완료될 수 있습니다.
nohup do_my_stuff &
b. 작업을 수행하려면 표준 입력에 대한 일부 정보를 제공해야 할 수도 있습니다.
man tmux history -w tmux do_my_stuff
백그라운드 프로세스는 어떤 방식으로든 현재 세션을 확장하며 세션과 함께 사라져야 합니다. 매우 드물다.
enhance_my_session >>/tmp/enhance.$$.log 2>&1 &
내 SSH 세션에서 일부 로그를 무작위로 뱉어내고 싶습니다. 무엇을 기다립니다? 아니요, 저는 절대 그런 걸 원하지 않습니다. 감사해요
disown
.내가 결코 원하지 않는 또 다른 점은 프로세스를 완전히 분리된 데몬으로 변환하되 다음 부팅 시 자동으로 시작하지 않는다는 것입니다. 시스템이 언제 재부팅될지, 누가 재부팅할지 예측할 수 없기 때문에 나는 이것을 결코 원하지 않을 것입니다.
답변2
일반적으로 저는 다음을 수행합니다.
myprog &
현재 로그인 셸에서 백그라운드로 무언가를 실행하고 싶다면 어떻게 해야 할까요? 99%의 경우 나에게는 충분합니다.nohup myprog > /my/path/output.txt &
셸에서 무언가를 시작했지만 나중에 로그아웃하려는 경우(백그라운드 작업이 계속 실행 중인 동안)
답변3
쉘 종료와 터미널 중단을 구별해야 합니다.
- 쉘이 중단 신호를 받으면 알려진 모든 작업을 종료합니다(하위 작업은 제외).
- 터미널은 제어 터미널로서 무엇이든 죽일 것입니다.
일반적으로 사용자 수준에서 가장 좋은 솔루션은 IMHO입니다 screen
.
작업이 사용자 관련이 아닌 시스템 관련인 경우 수동으로 시작하는 대신 시스템 서비스로 만들 수 있습니다.