Bash를 사용하는 데스크톱에서 프로세스를 시작하고 완전히 독립적으로 실행하려면 "&", nohup, disown 또는 세 가지 조합을 사용해야 합니까?

Bash를 사용하는 데스크톱에서 프로세스를 시작하고 완전히 독립적으로 실행하려면 "&", nohup, disown 또는 세 가지 조합을 사용해야 합니까?

로컬로든 SSH를 통해든 Xubuntu 16.04에서 이 네 가지 명령을 실행하면 모두 똑같은 작업을 수행하는 것 같습니다.

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
  1. gedit &
    
  2. gedit & disown
    
  3. nohup gedit
    
  4. nohup gedit & disown
    

gedit &gedit & disown상위 터미널을 종료하거나 SSH 세션에서 로그아웃하면 두 경우 모두 gedit가 "거부"되기 때문에 gedit와 gedit의 차이점을 이해하지 못합니다 .

두 번째와 세 번째의 경우, 내가 본 유일한 차이점은 명령 출력이 별도의 파일에 기록되고 bg 프로세스를 생성한 원래 셸 세션이 종료된 경우에도 해당 별도의 로그에 계속 기록된다는 것입니다.

3개와 4개의 경우 기술적인 차이가 있다는 글을 항상 읽었지만 왜 둘 중 하나를 더 선호하는지 전혀 모르겠습니다.

어느 것을 사용해야 합니까?튜토리얼과 Q&A에서 사용된 네 가지 명령을 모두 보았고 nohup과 disown의 기술적 차이점을 설명하는 매우 좋은 답변이 있지만 명확한 권장 사항을 얻을 수 없는 것 같습니다(로깅 목적이나 쉘 호환성 외에는) ) 사용해야겠어요.

답변1

잠시 동안 실행될 스크립트를 실행해야 할 때장기, 회의 중입니다 ssh. 원하는 것은 다음과 같습니다.

  1. 네트워크가 다운되거나 노트북을 챙겨 떠나더라도 작업은 계속되어야 합니다.

    ㅏ. 이 작업은 나의 대화형 입력 없이 완료될 수 있습니다.

     nohup do_my_stuff &
    

    b. 작업을 수행하려면 표준 입력에 대한 일부 정보를 제공해야 할 수도 있습니다.

     man tmux
     history -w
     tmux
     do_my_stuff
    
  2. 백그라운드 프로세스는 어떤 방식으로든 현재 세션을 확장하며 세션과 함께 사라져야 합니다. 매우 드물다.

     enhance_my_session  >>/tmp/enhance.$$.log 2>&1 &
    
  3. 내 SSH 세션에서 일부 로그를 무작위로 뱉어내고 싶습니다. 무엇을 기다립니다? 아니요, 저는 절대 그런 걸 원하지 않습니다. 감사해요 disown.

  4. 내가 결코 원하지 않는 또 다른 점은 프로세스를 완전히 분리된 데몬으로 변환하되 다음 부팅 시 자동으로 시작하지 않는다는 것입니다. 시스템이 언제 재부팅될지, 누가 재부팅할지 예측할 수 없기 때문에 나는 이것을 결코 원하지 않을 것입니다.

답변2

일반적으로 저는 다음을 수행합니다.

  1. myprog &현재 로그인 셸에서 백그라운드로 무언가를 실행하고 싶다면 어떻게 해야 할까요? 99%의 경우 나에게는 충분합니다.

  2. nohup myprog > /my/path/output.txt &셸에서 무언가를 시작했지만 나중에 로그아웃하려는 경우(백그라운드 작업이 계속 실행 중인 동안)

답변3

쉘 종료와 터미널 중단을 구별해야 합니다.

  1. 쉘이 중단 신호를 받으면 알려진 모든 작업을 종료합니다(하위 작업은 제외).
  2. 터미널은 제어 터미널로서 무엇이든 죽일 것입니다.

일반적으로 사용자 수준에서 가장 좋은 솔루션은 IMHO입니다 screen.

작업이 사용자 관련이 아닌 시스템 관련인 경우 수동으로 시작하는 대신 시스템 서비스로 만들 수 있습니다.

관련 정보