ssh 세션을 종료 한 후 프로세스를 계속 실행하는 방법은 무엇입니까?


답변:


750

같은 현대적인 대안을 찾아야합니다 tmux.

tmuxscreen여러 가지 이유로 우월합니다 . 여기에 몇 가지 예가 있습니다.

  • Windows는 세션간에 이동하거나 여러 세션에 연결할 수 있습니다
  • 창을 가로 및 세로로 분할 할 수 있습니다
  • UTF-8 및 256 컬러 터미널 지원
  • 세션을 입력 할 필요없이 쉘에서 세션을 제어 할 수 있습니다

기본 기능

답변 권장 사항 에서 설명한 것과 동일한 기능을 사용 screen하려면 다음을 수행해야합니다.

  • 원격 시스템으로 ssh
  • tmux에 입력하여 시작tmux
  • 시작된 tmux세션 내에서 원하는 프로세스를 시작하십시오.
  • + tmux를 입력 하여 세션을 종료 / 분리 한 다음Ctrlbd

이제 원격 시스템에서 안전하게 로그 오프 할 수 있습니다 tmux. 프로세스는 내부에서 계속 실행됩니다 . 다시 돌아와서 프로세스 상태를 확인하려면 세션 tmux attach에 연결하는 데 사용할 수 있습니다 tmux.

당신이 나란히 실행하는 여러 세션을 원한다면, 당신은 사용하여 각 세션의 이름을해야 Ctrl+ b$. 을 사용하여 현재 실행중인 세션 목록을 얻을 수 있습니다 tmux list-sessions. 이제 명령으로 실행중인 세션에 연결하십시오 tmux attach-session -t 0.

tmux단일 세션에서 단일 창을 처리하는 것보다 훨씬 더 고급 작업을 수행 할 수 있습니다. 자세한 내용은의 모습이 man tmuxTMUX GitHub의 페이지를 . 특히와 의 주요 차이점에 대한 FAQ 는 다음 screen과 같습니다 tmux.


4
@CraigM 하나의 화면 세션 만 활성화 된 경우 screen -x -r [screenname]또는 screen -rx짧게 사용하십시오 . 이를 통해 기존 화면 인스턴스를 연결할 수 있습니다.
Lekensteyn 10

5
이 조언은 같은 문제를 해결하는 데 도움이되었지만 오타가 포함되어 있다고 생각합니다. 나는 당신 이 세션 을 떠나거나 분리하기 위해 타이핑 Ctrl-b하고 나서야한다고 확신합니다 . 확실히 내 우분투 12.04 버전의 경우입니다 . dtmuxtmux
cxrodgers

17
위의 지침을 따르는 동안 실수를했습니다. 누군가가 같은 실수에 빠질 경우 공유 할 것입니다. 원격 컴퓨터의 쉘 대신 내 컴퓨터의 쉘에서 tmux를 시작했습니다. 원격 컴퓨터의 쉘에서 tmux를 시작해야합니다.
Mert Nuhoglu

5
이제 화면이 다시 개발되고 있습니다 : lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html 답변을 업데이트 할 수 있습니까?
muru

4
또는 tmux detach타이핑 대신 실행ctrl-b d
Andrew

305

옵션 1: nohup

가장 좋은 방법은 종종 가장 간단합니다.

nohup long-running-command &

이를 위해 특별히 만들어졌으며 stdout에로 기록합니다 nohup.log.

man nohup

옵션 2 : bg

이미 실행중인 일부 작업을 "배경"으로하려면 가장 좋은 방법은 Ctrl+ Z를 실행하는 것입니다.

bg

가장 최근에 일시 중단 된 작업을 백그라운드로 전환하여 계속 실행할 수 있습니다.

그런 다음 disown로그 아웃 한 후에도 프로세스를 빠르게 실행해야합니다.

screen그리고 다른 사람들도 그렇게 할 수 있지만 그것은 그들이 원하는 것이 아닙니다. nohup남겨두고 bg싶은 작업과 이미 실행 중이고 다시 시작하고 싶지 않은 작업에 권장 합니다 .

명심하십시오, 둘 다 bash 특정 적입니다. bash를 사용하지 않으면 명령이 다를 수 있습니다.


4
추천합니다disown -h
Michele

흥미롭게 화면 TMUX는 광부 작동 nohup을 가시 작동하지 않습니다
야신 Okumuş

1
bg+ disown나를 위해 작동하지 않았다. 나는 tmux에서 시작하는 것을 잊어 버린 배포 스크립트를 가지고 있었고 회의를 위해 일찍 떠나야했습니다. 스크립트는 계속해서 진행 상황을 쉘에 출력합니다. ctrl+z프로세스를 멈추고 bash로 돌아 왔습니다. bg프로세스를 다시 시작했지만 상태를 bash로 다시 출력하여 입력 한 내용을 볼 수 없었습니다. 그러나 disown명령은 "disown : current : no such job"을 생성했습니다.
BrianHVB

이것은 julia myFile.jl어떤 이유로 든 나를 위해 작동하지 않았습니다 . tmux는 훌륭합니다.
kilgoretrout

이것은 나를 위해 일했다, 정말 고마워
Chad

207

을 사용하여 그렇게 할 수 screen있습니다.

man screen자세한 내용을 보거나이 화면 맨 페이지를 읽으려면 입력 하십시오 .

간단한 시나리오 :

  • 당신의 원격 상자에 ssh. 입력 screen한 다음 원하는 과정을 시작합니다.

  • Ctrl-를 A누른 다음 Ctrl-를 누르십시오 D. 그러면 화면 세션이 "분리"되지만 프로세스는 계속 실행됩니다. 이제 원격 박스에서 로그 아웃 할 수 있습니다.

  • 나중에 다시 방문하려면 다시 로그온 한 screen -r다음 화면 세션을 "다시 시작합니다"라고 입력 하면 프로세스의 출력을 볼 수 있습니다.


32
일반적으로 screen -S name나중에 올바른 세션에 더 쉽게 연결할 수 있도록 화면 세션 이름 을 사용합니다.
David Oneill

링크가 다운되었습니다
Gab 是 好人

1
개인적으로 저는 패키지 제어 소프트웨어없이 상자를 만들고 있습니다. 소스에서 TMUX에 대한 약 30 분의 빌드 종속성을 개인적으로 경험 한 후 화면이 나에게 더 좋고 간단한 솔루션이라는 것이 분명해졌습니다. TL; DR :이 문제에 대한 최적의 솔루션은 유스 케이스, 기계 및 설정 시간에 따라 다릅니다. :)이 답변을 주셔서 감사합니다
맥스 폰 Hippel

screen -S휴가 전과 screen -r돌아올 때의 조합 은 놀랍습니다!
Meloman

고마워 이 솔루션은 tmux 가하지 않은 동안 나를 위해 일했습니다 (리눅스 머신에 ssh'ing하는 동안 Windows 용 bash 버전을 사용합니다)
Michael Sorensen

83

Screen and nohup이 더 좋은 방법이지만 screen 또는 nohup없이 이미 실행중인 프로세스를 분리해야하는 경우 disown 명령을 실행할 수 있습니다.

disown [-ar] [-h] [jobspec… |pid… ]

옵션이 없으면 활성 작업 테이블에서 각 작업 스펙 을 제거하십시오 . 경우 -h옵션이 주어 작업이 테이블에서 제거되지 않습니다 만, 쉘이 SIGHUP를 수신하는 경우 그 SIGHUP이 작업에 전송되지 않도록 표시됩니다. 경우 jobspec이 존재하지 않고, 어느 것도 -a-r옵션이 제공되어, 현재 작업이 사용됩니다. jobspec 이 제공 되지 않으면 이 -a옵션은 모든 작업을 제거하거나 표시하는 것을 의미합니다. -r없이 옵션 jobspec 인수 작업을 실행하는 작업을 제한합니다.

disown을 사용하면 터미널을 닫고 시스템에서 프로세스를 실행할 수 있습니다.


10
이것은 또한 내가 가장 좋아하는 방법입니다. 나는 자주 사용한다disown -a && exit
Stefano Palazzo

1
완전한. 이것은 멋진 명령이며 모든 공감대가 필요합니다!
그렉

8
한 가지주의 할 점은 Ctrl-Z를 사용하여 실행중인 프로세스를 중지했으며 호출하기 전에 백그라운드에서 시작하지 않고 종료되었습니다 disown.
HDave

3
터미널에 쓰려고하면 충돌 할 수 있습니다. 실행중인 프로세스의 출력을 리디렉션하는 것은 쉽지 않습니다. nohup으로 올바르게 시작하는 것이 좋습니다.
jiggunjer

2
질문에 직접 답변하기 때문에 좋은 답변입니다. 이 질문의 저자는 이미 오래 실행 된 많은 명령을 실행 한 수행 할 작업 물었습니다 . 이러한 답변의 대부분은 명령을 실행 하기 전에 수행 할 작업을 알려줍니다 .
q0rban

53

큰 mv에 갇혀 프로세스, 설정 화면을 중지 한 다음 다시 시작하는 위치에 없었습니다. 본질적으로 다음 단계를 수행하여 프로세스가 실행되는 ssh 세션을 종료했습니다.

  1. ssh [서버]
  2. 명령
  3. Ctrl+Z
  4. bg
  5. disown [프로세스 pid 옵션, 기본값은 last]
  6. 출구

3 단계는 현재 프로세스를 일시 중지합니다 (예 : my 'mv'명령).
4 단계는 일시 정지 된 프로세스를 백그라운드에 넣고 다시 시작합니다.
5 단계에서 프로세스를 제거 할 수 있습니다. ** 작업 목록을 얻으려면 간단히 입력하십시오 jobs.


** 폐기 관련 정보 (bash 설명서) :

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.

2
내장은 항상 내 첫 번째 선택입니다 :) THX
ken_oy

이 답변은 올바른 것으로 표시되어야합니다. 이 문제를 해결하기 위해 스크린에 설치하고 익숙해지는 것은 과장된 것입니다.
Ulrich-Lorenz Schlüter

이것은 명령을 이미 시작했고 오랫동안 실행중인 경우에 매우 유용합니다. TMUX 세션에서 종료하고 시작하는 데 시간이 걸립니다
Deepali Mittal

1
@ tom-brossman : 이와 같은 불필요한 편집을 조심하십시오 ! 작업 스펙없이 호출 된 경우 disown내장 명령은 가장 최근의 백그라운드 작업에서 작동합니다.
David Foerster

22

여러 ssh 연결을 통해 프로그램과 터미널 상태를 유지하는 데 사용할 수있는 두 가지 주요 프로그램이 있습니다. 그것들은 스크린 (현재는 있지만 불행히도 유지되지 않습니다. 현재 적극적으로 개발되고 있음 )과 tmux (새로운, 적극적으로 유지됨)입니다. Byobu는 이러한 시스템에서 실행할 수 있고 추가 우분투 상태 정보를 제공하는 프런트 엔드입니다. 새 설치에서는 tmux를 백엔드로 사용하며, byobu의 이전 설치 및 기존 구성이있는 경우 이전 백엔드 (스크린 또는 tmux)를 유지합니다.

o 부

Byobu는 데비안 기반 컴퓨터에서 설치하여 컴퓨터에 설치할 수 있습니다.

sudo aptitude install byobu

yum을 사용하면

su -c 'yum install byobu'

byobu를 다른 배포판에 설치할 수도 있습니다.

byobu 사용

byobussh를 사용하여 연결 한 후 호스트 시스템에서 실행 하여 byobu를 시작할 수 있습니다 . 이렇게하면 다음과 같은 쉘이 나타납니다.

이미지 별

또한 -X 옵션이있는 Ubuntu 시스템에서 Byobu 터미널을 사용하고 쉽게 byobu를 사용할 수 있습니다.

용법:

을 입력하여 byobu를 시작하십시오 byobu.

F2를 눌러 현재 세션 내에서 새 창을 만들고 F3-F4를 사용하여 다양한 창 사이를 전환 할 수 있습니다.

byobu의 가장 좋은 점은 터미널에서 나가기 위해 터미널에서 실행중인 프로세스를 실제로 죽일 필요가 없다는 것입니다. 간단히 screen / tmux (byobu의 골격)를 배경으로 보내고 다음에 올 때 다시 시작할 수 있습니다.

  • byobu를 떠나서 작동 상태를 유지하려면 (분리) F6을 누르십시오.
  • 다음에 오실 때는 그냥 byobu하시면됩니다.

    byobu 분리 분리

다양한 byobu 세션 등을 만들 수도 있습니다 byobu -S session1. 돌아올 때 둘 중 하나에 연결할 수 있습니다.

Byobu를 사용하면 훨씬 더 많은 것을 할 수 있습니다. 그걸 써! 몇 가지 결정적인 안내서가 여기있습니다 .


PuTTY 기반 세션에서 byobu를 사용하여 우분투 상자로 사용해 보았지만 상태 표시 줄이 반복되어 디스플레이에서 스크롤됩니다. F6을 눌렀을 때 제대로 분리되었지만 내 설정에서 유용한 솔루션은 아닙니다.
jfmessier

1
@jfmessier PuTTY가 ncurses (기본적으로 UTF-8)를 잘 사용하지 않기 때문입니다. 이 스레드를
따라이

대단해! 1. bash를 기본 쉘로 사용할 수없는 것처럼 보이는 bash 프롬프트가 표시됩니다 .2. 동시에 2 개의 봇을 실행하고 여전히 작업 할 다른 터미널이 있습니다! @SiddharthaRT 당신은 공감할만한 가치가 있습니다!
Dev

18

프로세스가 시작된 후에는이를 수행 할 수 없으므로 장기 실행 작업을 실행하기 전에 설정해야합니다.

nohup 을 사용할 수 있지만 현대의 지혜는 screen 또는 byobu를 로그인으로 사용하여 항목을 분리하고 계속 실행할 수 있도록 제안합니다.

Screen은 한 기계에서 분리하여 다른 기계에서 다시 부착 할 수 있다는 장점이 있습니다. 이는 작업 일이 끝날 때까지 실행되는 장기 실행 프로세스를 확인하려는 경우에 편리합니다.

여기에 합리적인 시작 안내서가 있습니다.

byobu 는 메뉴 등으로 화면 상단에 사용하기 쉬운 인터페이스를 제공합니다. 또한 최신 우분투에서 현재 화면 구현입니다. F2는 새 터미널을 시작하고 F3 / F4는 앞뒤로 전환하고 F6은 연결을 끊습니다. 실제로 터미널을 영구적으로 종료하려면 exit를 입력하십시오.


byobu는 요즘 tmux를 사용합니다 ..
scottl

12
"프로세스가 시작된 후에는이를 수행 할 수 없습니다. 장기 실행 작업을 실행하기 전에 설정해야합니다." -아니요, disown이를 달성 하는 데 사용할 수 있습니다 . @bassgey의 답변보기
Rich

1
화면과 tmux를 배우기 위해 고군분투 .... byobu 내 눈에 눈물을 가져왔다
HDave

disown다만 필요한 경우 Ctrl-z, 다음 bg이를 활성 터미널과 배경을 얻을 수 있습니다. 그런 다음, disown.
mimoralea

8

나는 스크린이 가장 효과적인 옵션이라는 것에 동의했다. vncserver를 사용한 다음 프로세스를 시작할 수 있습니다.

또한 유일한 상호 작용이 프로세스를 실행하고 다시 제어 할 필요가 없으며, 가장 중요한 것은 세션을 닫고 프로세스가 이미 실행 중임을 인식하지 못했다면 운이 좋지 않은 경우 bash를 쉘로 사용했습니다.

먼저 Ctrl + Z와 bg % 1을 차례로 입력하여 프로세스를 백그라운드로 보내야합니다 (숫자는 작업 번호에 따라 다르지만 일반적으로 1이지만 작업 명령을 사용하여 쉽게 목록을 가져올 수 있습니다)

마지막으로 disown 명령을 호출합니다 (bgid 명령과 동일하게 jobid 뒤에옵니다).

이렇게하면 쉘과 백그라운드 프로세스 간의 부모-자식 관계가 제거되어 쉘이 종료 될 때 죽지 않게됩니다.


2
이 답변이 최고입니다! 왜 모든 사람들이에 대해 이야기하고 screen있으며, 질문은 로그인 후 이벤트를 시작한 후 로그인하기 전에 프로세스를 계속 실행하는 방법에 대해 제기되었습니다. 위대한 답변 Jorge, 당신은 정말 나를 도와주었습니다! :)
jwbensley 2016 년

1
간단하게 bg(하지 않고는 %1기본이 현재 작업이기 때문에), 종종 충분하다
월터 Tross

포괄적 인 답변을 얻는 것이 좋을 것입니다 : 선험적 (미리 설정) : ASCII 터미널 화면 (이전), tmux (더 낮은); X 윈도우 : vnc (이전, 여전히 유지됨), xpra (최신), xpra는 루트가 없습니다. 후부 (당신이 시작한 후에 지속) : ^ Z, disown, ... 그러나 나는 이것보다 더 육체를 만들기에는 너무 게으르다.
Krazy Glew

8

오랫동안 실행 한 단일 셸 스크립트의 경우 '&'를 사용하여 백그라운드에서 로그인하고 프로세스를 실행합니다.

예:

/path/to/my/script &

SSH 세션에서 로그 아웃하고 연결을 끊었습니다. 나중에 로그인해도 스크립트에서 지속적으로 데이터를 수집하여 입증 된대로 스크립트가 계속 실행됩니다.


3
예,이 간단한 솔루션보다 screen / tmux가 더 나은 방법을 알고 싶습니다.
Mads Skjern

예, 우분투에서도 이것을 볼 수 있지만 이론 상으로는 일어나지 않아야합니다. 왜 그런지 모르겠습니다
Daniel Pinyol

1
@MadsSkjern이 방법을 사용하여 스크립트에 입력을 입력 할 수 없기 때문입니다.
Ken Sharp

1
@MadsSkjern 그 이유는 &로그 아웃하고 SSH 세션에 로그인하면 이와 같은 프로세스를 실행 하면 프로세스가 계속 실행 되지만 프로세스 의 출력 을 볼 수는 없기 때문 입니다 (스크립트에서 무언가가 에코 된 경우) 보이지는 않지만 파일을 쓰면 파일이있을 것입니다)
DarkCygnus

4

당신은 체크 아웃해야 GNU 화면 과 당신을하는 데 도움이되는지 확인합니다. 응용 프로그램을 실시간으로 실행해야하는 방법에 따라 해결하는 것보다 더 많은 문제가 발생할 수 있지만 적어도 세션을 마치지 않은 것처럼 다시 시작할 수 있습니다.

사용하는 방법 :

  • screen첫 번째 시작 명령 을 사용하고 소개 메시지를 스크롤하면 터미널이 전달됩니다.
  • Ca Cc는 다른 터미널을 엽니 다
  • Ca Ck는 터미널을 죽인다
  • Ca C-Space 및 Ca C-Backspace를 사용하여 터미널을 순환 할 수 있습니다
  • Ca Ca는 주로 두 개의 터미널 만 사용하는 경우 편리합니다
  • Ca Cd는 현재 화면 세션을 분리하고 화면을 종료합니다. 그런 다음 screen -r해당 세션을 재개하는 데 사용할 수 있습니다 . 한 번에 여러 개의 분리 된 화면 세션을 가질 수 있으며,이 경우 사용 가능한 세션 목록이 표시됩니다.

화면 분할과 같은 다른 많은 옵션이 있으며 모든 바로 가기를 완전히 사용자 지정할 수 있습니다.


3

가장 간단한 답변 ...

ctrl + z는 실행중인 프로그램을 일시 중단합니다

"bg"는 백그라운드에서 실행됩니다


5
(같은과 과정을 부인하는없이 disown또는 nohup)이 일반적으로 SSH 세션이 끝난 후 공정을 계속 실행하지 않습니다.
Eliah Kagan

3
기본 설정으로 우분투 서버에서 실제로 계속 실행됩니다!
Mads Skjern

3

가장 쉬운 방법은로 백그라운드에서 명령을 실행하는 것입니다 &. 그런 다음 작성하십시오.

disown -a

0

모든 사람들이 disown(프로세스를 이미 시작한 후에 유일 하게 사용 하는 옵션) nohup또는 명령을 실행 한다고 말하지만 명령의 screen모든 출력을보고 싶을 때 유용합니다 ... 나는 팬입니다. screen.. 나는 여전히 리눅스의 최신 주류 배포판을 시도했지만 단순히 백그라운드에서 작업을 시작하고 종료한다고해서 실행중인 모든 프로세스가 종료되는 것은 아닙니다. 전역 설정 또는 무언가가 있어야합니다. 꽤 오래된 시스템 (슬랙웨어 12) 에서이 작업을 시도하고 있으며 수동으로 종료 할 때까지 테스트 스크립트가 계속 실행됩니다.

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

동의하지만 그건 screen내 스크립트 파일 또는 무엇 이건 .. 내가 사용하는 데 필요한 적이을 기록 쓴 경우에도이를 실행하는 가장 좋은 방법이 될 것입니다 disown -a 또는 nohup이 완료 편집증에서였다 그러하지 아니하다. 어쩌면 누군가가 bash가 기본적으로 어떻게 동작하는지에 대해 약간의 지식을 밝힐 수 있습니까? 어쩌면 일부 시스템 관리자는 사용자의 프로세스에 시스템 과부하가 걸리지 않도록 대형 쉘의 기본값을 변경합니까?



0

불행히도 SSH 세션이 종료되면 tmux 또는 화면이 종료 될 수 있습니다. systemd세션에서 로그 아웃하면 모든 자식 프로세스가 종료 되기 때문 입니다.

logind.conf( /etc/systemd/logind.conf) 에서이 설정을 변경할 수 있습니다 .

KillUserProcesses=no

https://unix.stackexchange.com/questions/490267의 답변에 감사드립니다 .


-1

대신에 :

cmd options; 

전에 추가 nohup:

nohup cmd options & 

그러면 다음과 같이 콘솔 stdout을 볼 수 있습니다.

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