로그 아웃 한 후 Linux 프로세스를 계속 실행


142

SSH를 통해 Linux 컴퓨터에 연결하고 있으며 파일 시스템 작업을 수행하는 강력한 bash 스크립트를 실행하려고합니다. 몇 시간 동안 계속 실행될 것으로 예상되지만 인터넷 연결 문제로 인해 SSH 세션을 열어 둘 수 없습니다.

백그라운드 연산자 인 앰퍼샌드 ( &)로 스크립트를 실행하면 트릭을 수행 할 수 있습니다. 로그 아웃하고 프로세스를 계속 실행하려면 어떻게해야합니까?

답변:


135

가장 좋은 방법은 터미널 멀티플렉서에서 프로세스를 시작하는 것입니다. 또는 프로세스가 HUP 신호를받지 않도록 할 수 있습니다.


터미널 멀티플렉서는 "진짜"터미널 (실제로는 모든 터미널 오늘날의 "가상"하지만 그건 다른 날 또 다른 주제)에서 독립 실행 "가상"단자를 제공합니다. 실제 터미널이 ssh 세션으로 닫혀 있어도 가상 터미널은 계속 실행됩니다.

가상 터미널에서 시작된 모든 프로세스는 해당 가상 터미널에서 계속 실행됩니다. 서버에 다시 연결하면 가상 터미널에 다시 연결할 수 있으며 경과 한 시간 외에는 아무 일도 일어나지 않은 것처럼됩니다.

널리 사용되는 2 개의 터미널 멀티플렉서는 screentmux 입니다.

화면에 가파른 학습 곡선이 있습니다. 다음은 개념을 설명하는 다이어그램이있는 유용한 학습서입니다. http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


HUP의 단자가 닫힐 때 신호 (또는 SIGHUP)은 모든 자식 프로세스에 단말이 전송된다. SIGHUP을 수신 할 때 일반적인 조치는 종료하는 것입니다. 따라서 ssh 세션의 연결이 끊어지면 모든 프로세스가 종료됩니다. 이를 피하기 위해 프로세스가 SIGHUP을받지 못하게 할 수 있습니다.

그렇게 할 두 가지 쉬운 방법은 nohupdisown.

방법 nohupdisown작동 에 대한 자세한 내용은 이 질문과 답변을 참조하십시오 . https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

참고 : 프로세스는 계속 실행되지만 더 이상 터미널에 연결되어 있지 않으므로 더 이상 상호 작용할 수 없습니다. 이 방법은 한 번 시작하면 더 이상 사용자 입력이 필요하지 않은 장기 실행 배치 프로세스에 주로 유용합니다.


3
나는 대화 형 및 비대화 형 상황 모두에 대한 솔루션을 제공하기 때문에이 답변을 좋아합니다. 대화 형의 경우, screen당신에게 더 많은 옵션을 제공하지만, 당신이 사용하는 경우 authorized_keys사람들이 원격을 통해 스크립트를 실행할 수 있도록 sshnohup옵션은보다 더 오래 프로세스를 시작하는 스크립트에 대한 좋은 간단한 방법입니다 ssh세션을 시작하는 데 사용을 .
Mark Booth

1
@rahmanisback-언제든지 수락 된 답변을 변경할 수 있습니다. 지금까지 EricA의 답변이 가장 많이 투표되었다고해서 이것이 귀하에게 가장 적합한 답변임을 의미하는 것은 아니며, 실제로 수락 된 답변을 만들면 더 많은 사람들이 좋은 답변으로 투표하도록 권장 할 수 있습니다.
Mark Booth

3
* cough * tmuxisbetter * cough *
crasic

3
tmux > 화면. 다시 시도하지 마십시오.
h0tw1r3

1
@TheLQ-byobu GNU 화면입니다. 고도로 사용자 정의 된 .screenrc와 함께 여전히 screen을 사용하고 있습니다.
EEAA

92

몇 가지 방법이 있지만 가장 유용한 방법은 GNU Screen 을 사용하는 것 입니다.

당신이 ssh 후, 실행 screen합니다. 화면 내에서 다른 쉘이 실행됩니다. 명령을 실행 한 다음 Ctrl- 를 수행하십시오 a d.

그러면 화면 세션에서 "연결이 끊어집니다". 이 시점에서 로그 아웃하거나 원하는 다른 작업을 수행 할 수 있습니다.

화면 세션에 다시 연결 screen -RD하려면 셸 프롬프트에서 실행 하십시오 (세션을 만든 동일한 사용 사용자로).


6
화면에는 Ctrl-a로 시작하는 명령이 많이 있습니다. 하나만 더 배우면 "Ctrl-a?"로 시작하십시오. 그러면 "Ctrl-a c"와 "Ctrl-a n"을
배우지 않을 것입니다

@olafure +1, 감사합니다. Screen이 내 기본 도구 상자가 될 것 같습니다.
doc_id

tmux > 화면. 다시 시도하지 마십시오.
h0tw1r3

tmux의 경우 +1 5 주 전에 화면을 포기했습니다.
Bryan Hunt

73

에서 bashdisown키워드는이에 완벽하게 적합합니다. 먼저 백그라운드에서 프로세스를 실행하십시오 (use &또는 ^Ztype bg).

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

입력 jobs하면 프로세스가 여전히 셸에서 소유하고 있음을 알 수 있습니다.

$ jobs
[1]+  Running  wget

이 시점에서 로그 아웃하면 백그라운드 작업도 종료됩니다. disown그러나을 실행 하면 bash가 작업을 분리하고 계속 실행할 수 있습니다.

$ disown

이것을 확인할 수 있습니다 :

$ jobs
$ logout

다음 &disown같이와 같은 줄을 결합 할 수도 있습니다 .

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

파일 시스템 전체에 파일이 흩어져 nohup있지 않기 때문에 내 의견으로 는 실행하는 것보다 낫습니다 nohup.out. 또한 nohup명령을 실행하기 전에 실행해야합니다. disown나중에 백그라운드에서 작업을 분리하고 분리하기로 결정한 경우에만 사용할 수 있습니다.


1
아주 좋은 대답입니다. 1+. nohup 또는 Screen의 유일한 환경 설정은 bash의 독립성이며 다른 쉘과 함께 사용될 수 있습니다. 그러나 나는 bash를 사용할 때마다 당신의 접근 방식을 고수 할 것입니다.
doc_id

예 – bash는 내가 사용한 유일한 쉘이기 때문에 bash 전용입니다. 다른 쉘이 비슷한 것을 지원하는지 궁금합니다 (예 : nohup없이 백그라운드에서 시작). 다른 쉘에 다른 답변을 게시 할 수 있다면 환상적입니다.
Jeremy Visser

1
어떤 sh-lookalike로 그것을 수행하는 방법을 보여주는 내 답변을 참조하십시오
w00t

1
나중에 결정할 수 있기 때문에 +1 바로 지금이 순간이 필요했습니다. 광고로 작동
code_monk

37

대부분의 Linux 박스에서 사용 가능한 도구 nohup이이를 수행합니다.


1
이것은 가장 간단한 답변입니다. 의 출력은 자동으로 nohup.out으로 보내지고 나중에 검사 할 수 있습니다.
Julian

3
nohup에는 zsh가 전혀 필요하지 않습니다.
Aaron Brown

nohup은 정답이며 끊지 않습니다.
Kinjal Dixit

2
nohup은 화면보다 훨씬 많은 기계에서 발견되므로 사용 방법을 알아야합니다.
Zenon

27

철저히하기 위해 화면과 동일한 기본 아이디어를 갖는 tmux를 지적합니다 .

tmux는 GNU 화면과 같은 프로그램을 대체 할 수있는 최신 BSD 라이센스 대안입니다. 주요 특징은 다음과 같습니다.

  • 강력하고 일관되며 잘 문서화되고 쉽게 스크립트 가능한 명령 인터페이스
  • 창은 가로 및 세로 창으로 분할 될 수 있습니다.
  • 창을 자유롭게 이동하고 크기를 조정하거나 사전 설정 레이아웃으로 배열 할 수 있습니다.
  • UTF-8 및 256 색 터미널을 지원합니다.
  • 여러 버퍼로 복사하여 붙여 넣기
  • 창, 세션 또는 클라이언트를 선택할 수있는 대화식 메뉴.
  • 대상에서 텍스트를 검색하여 현재 창을 변경하십시오.
  • 수동 또는 시간 초과 후 터미널 잠금.
  • 적극적으로 개발중인 깨끗하고 쉽게 확장되는 BSD 라이센스 코드베이스.

그러나 Google에서 검색하는 것은 거의 무한합니다.


2
"gnu screen"검색어로 사용하면 매우 효과적입니다.
gnur

4
tmux의 경우 +1000!
mbq

11

로그 아웃 할 때 프로세스를 계속 실행하면 화면이 과도하게 사용됩니다.

dtach 사용해보십시오 :

dtach는 화면의 분리 기능을 에뮬레이트하는 C로 작성된 프로그램으로, 제어 터미널로부터 보호되는 환경에서 프로그램을 실행할 수 있습니다. 예를 들어, dtach가 제어하는 ​​프로그램은 어떤 이유로 인해 연결이 끊어진 터미널의 영향을받지 않습니다.

dtach는 화면이 내 요구를 적절하게 충족시키지 못했기 때문에 작성되었습니다. 다중 터미널 지원 또는 터미널 에뮬레이션 지원과 같은 화면의 추가 기능이 필요하지 않았습니다. 화면도 너무 크고 부피가 커서 이해하기 어려운 소스 코드가있었습니다.

프로그램과 연결된 터미널 사이의 스트림에 대한 과도한 해석으로 인해 screen은 emacs 및 ircII와 같은 전체 화면 응용 프로그램의 사용을 방해했습니다. dtach에는 터미널 에뮬레이션 레이어가 없으며 프로그램의 원시 출력 스트림을 연결된 터미널로 전달합니다. dtach가 수행하는 유일한 입력 처리는 분리 문자 (프로그램에서 분리 할 신호가 dtach)를 스캔하고 일시 중단 키 (dtach가 실행중인 프로그램에 영향을주지 않고 일시적으로 일시 중단하도록 지시 함)를 처리하는 것입니다. 원하는 경우 비활성화하십시오.

화면과 달리 dtach는 최소한의 기능을 가지고 있으며 매우 작습니다. 이를 통해 dtach는 버그 및 보안 허점에 대해보다 쉽게 ​​감사 할 수 있으며 복구 디스크와 같이 공간이 제한된 환경에서 액세스 할 수 있습니다.


감사합니다. 나는 dtach에 대해서도 게시하기 위해 여기에 왔습니다. 그것은 이제 터미널 분리를위한 것입니다. 화면이 너무 길어서 말도 안되는 입력을 방해합니다. 사실 화면에는 자체 용어 캡이 필요합니다.
솜털

9

다음은 외부 프로그램없이 쉘 프로세스를 디먼하는 방법입니다.

( while sleep 5; do date; done ) <&- >output.txt &

그런 다음 세션을 닫으면 output.txt 파일 (버퍼링이 있으므로 0이 아닌 것을 표시하는 데 시간이 걸립니다)에 의해 증명 된대로 작업이 계속 실행됩니다. 테스트 후 직장을 죽이는 것을 잊지 마십시오.

그래서 당신이해야 할 일은 stdin을 닫고 작업을 배경으로하는 것입니다. 정말로 좋으려면 먼저 cd /마운트를 잡지 마십시오.

이것은 솔라리스에서 간단하게 작동합니다.


흥미 롭군 그것은 몇 가지 주목할만한 질문이 생겼습니다. STDIN을 아무것도 설정하지 않았다는 것을 알 -수 있습니까? 차이점은 무엇이며 < /dev/null그리고 &-? STDIN (및 기타 STDOUT 및 STDERR) 에 STDIN의 경우 파일 < file또는 스트림을 할당 할 수 있다고 생각합니다 <& stream. < /dev/null위의 예에서 와 동일 합니까? 그리고 -위 의 연산자 는 null을 스트림으로 참조합니까?
doc_id

x <&-를 수행하면 파일 설명자 x가 닫힙니다. 이 경우 x가 없으므로 bash의 기본값은 1입니다 (예 : 표준 입력). </ dev / null을 사용하면 stdin을 닫지 않고 빈 파일을 입력하여 프로그램에 제공합니다.
w00t

1
그리고 솔직히 말해서 이것이 왜 당신이 실행중인 것을 데몬으로 만드는지 모르겠습니다 :-) 작동하지만 프로덕션 환경에서 사용합니다. 나는 특별한 것을 필요로하지 않고 쉘에서 프로세스를 디먼으로 처리 할 수 ​​있기를 희망하면서 그것을 깨달았습니다. 그래서 stdin을 닫는 것으로 시작했으며 충분했습니다. 쉘 소스를 읽어야하지만 stdin을 닫고 프로세스를 백그라운드로 처리하면 프로세스가 분리된다고 가정합니다.
w00t

2
부모 프로세스가 자식의 stdin 핸들을 닫을 때 SIGHUP (쉘이 죽을 때 자식을 종료시키는 실제 신호)이 트리거되기 때문입니다. 그러나 사실 이후에 닫히지 않고 stdin null로 시작 하면 부모가 SIGHUP을 트리거 할 수있는 방법이 없습니다. 그래도 좋은 발견은 결코 생각하지 못했을 것입니다.
Jeremy Visser

정말 그럴듯하게 들리는 @JeremyVisser!
w00t

7

at명령은 이런 상황에 유용 할 수 있습니다. 예를 들어, 다음을 입력하십시오.

at now

그런 다음 실행될 명령 또는 일련의 명령을 입력 할 수 있습니다. 기기에 이메일이 올바르게 설정된 경우 결과를 이메일로 보내야합니다.

대신 now날짜와 시간을 선택적으로 지정하거나과 같은 시간 표현을 지정할 수 있습니다 now + 15 minutes. 자세한 내용 man at은 참조하십시오.


7

byobu우분투에서 화면에 좋은 프론트 엔드입니다. 누르면 Ctrl- ?당신은 모든 키보드 단축키 목록을 얻을. CPU로드, 디스크 공간 등을 감시하는 데 유용한 상태 표시 줄을 추가합니다. 전반적으로 터미널 기반 VNC 연결로 설명하는 경험을 제공합니다.

nohup 출력을 로그 파일로 라우트하여 백그라운드에서 작업을 시작할 수 있으며, 필요하지 않은 경우 항상 / dev / null로 경로 재 지정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.