SSH에서 로그 아웃 한 후 현재 실행중인 Linux 작업이 종료되지 않도록 방지


18

SSH 연결을 통해 Linux 서버에서 며칠 동안 계산 작업을 실행하고 있습니다. 백그라운드에 있지 않으므로 SSH 연결이 작업을 보류 중입니다.

ssh 세션을 연 로컬 컴퓨터 (서버가 아닌)를 다시 시작하고 싶지만 작업을 계속 실행하고 싶습니다. 가능합니까?

답변:


22

귀하의 작업이 이미 시작된 경우, 너무 늦기 *다른 솔루션을 고려하는 것이 당신의 사이에 추가 계층 삽입 ssh세션 쉘이 명령을 실행 같은 screen, tmux, byobu, nohup및 좋아.

프로세스 지원이 배경에 배치하고, 특히 끊지 않으면 stdoutstderr폐쇄 / 쓰기가 불가능하고, 당신은으로 로그 아웃하기 전에 배경에 넣을 수 있습니다 ControlZbg다음과 쉘에서 분리 disown내장.

예 :

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

*Bob이 언급했듯이 Linux에서 tty 세션을 다시 보호하는 몇 가지 해킹 방법이 있습니다. repty, retty , injcodeneercs 입니다. 가장 고급 스러운 모습은 pptyr 이지만 ptrace가 프로세스를 해킹하려면 루트 권한이 필요할 수 있습니다.


Ctrl + Z를 사용하여 작업을 중지하고 백그라운드로 이동 한 다음 disown명령 을 수행했습니다 . bash : warning : 프로세스 그룹 24876에서 중지 된 작업 1을 삭제하는 중입니다. 이제 내 작업이 나열 ps -all되었지만 작동하지 않는 것 같습니다 (CPU 사용량은 0 % 임)
Ali

내 프로세스가 중지 된 것 같습니다. 나는 disown명령으로 프로세스 ID를 제공 했어야한다고 생각한다
Ali

@Ali 일시 중지 된 작업을 다시 시작하기 위해 bg 명령을 실행하는 것을 잊었다 고 생각합니다.
Jason Zhu

1
@JasonZhu 고맙습니다. bg답장의 첫 부분에서 명령이 필요한지 확실하지 않았습니다. 편집했습니다.
jlliagre

2
bg 명령을 잊어 버리고 disown 명령 만 실행했다면 bg와 kill -CONT거의 같은 프로세스를 다시 실행할 수 있습니다.
kasperd

5

한 가지 해결책은 GNU screen 을 사용하는 것 입니다. 시작하고 screen명령을 실행 한 다음로 분리 할 수 C-a d있습니다. 나중에 다시 연결하려면를하고 screen -r이전 세션으로 돌아갑니다.

화면의 다른 이점은 창 관리 (새 SSH 연결없이 명령이 실행되는 동안 다른 쉘로 전환 할 수 있음)이며 현재 세션이든 이후 세션이든 명령이 포 그라운드로 유지되도록합니다.

편집 : 주석에서 언급했듯이 screen명령을 실행하기 전에 시작 해야하는 경우에만 작동합니다 . 명령이 이미 실행 중이면 @jlliagre의 솔루션이 필요합니다.


2
tmux같은 다른 프로그램 screen은 현재 SSH 연결에 묶여 있지 않은 원격 세션을 가질 수 있습니다.
다스 안드로이드

2
당신의 솔루션은 훌륭합니다. 그러나 그것은 내 질문에 완전히 맞지 않습니다. 나는 현재 실행중인 프로세스에 대해 물었지만 나중에 사용하는 프로세스가 아닙니다 screen.
Ali

아, 알았어요 이 경우 @jlliagre의 솔루션을 사용해야한다고 생각합니다. (내가 아는 한, 같은에 이미 실행중인 프로세스를 연결 할 수있는 방법이 없다 screen거나 tmux.)
스콧 웰던

1

이를위한 "표준"방법 중 하나는 다음 과 같은 nohup명령 을 사용하는 coreutils것입니다.

nohup COMMAND [ARGS] &

그러나이 명령은 프로그램 의 출력 ( STDOUT& STDERRAFAIK)을 파일로 리디렉션하여 nohup.out때로는 큰 로그 파일 생성과 같이 때로는 성가 시므로 직접 리디렉션하거나 / dev / null로 리디렉션 할 수 있습니다 네가 원한다면.


2
다시 읽으세요. 프로세스가 이미 실행 중 입니다.
Monica와의 가벼움 경주

/ 부끄러움을주의 깊게 읽지 않았습니다. 죄송합니다.
wangguoqin1001

실제로 nohup이것을 사용할 수 있습니다. 실행중인 프로세스를 일시 중단하고 백그라운드로 보내면 ( Ctrl+ Z및 실행 bg) 발행 할 수 있습니다 nohup %1.
mike

0

뿐만 아니라 nohup당신 "&"사용하고 서브 쉘 백그라운드에서 프로세스를 시작할 수 있습니다 :

&로 명령 접미사를 괄호로 묶습니다.

$ (thecommand args &)

프로세스가 pid 1922를 얻는다고 가정 해 봅시다.

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

그것이 원래 부모 인 쉘 프로세스 11473에서 연결되지 않은 것을보십시오. 따라서 현재 셸 (11473)을 종료하거나 종료하면 프로세스 11922가 계속 실행되며 pt와 연결이 끊어집니다.

쉘을 종료하고 새 쉘을 입력하십시오. 이 쉘이 동일한 pt에 연결되어 있어도 pts없이 프로세스를 볼 수 있습니다.

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

Posix에서 어떻게 호출되거나 문서화되는지는 아니지만 1990 년부터 bsh, ksh 및 bash 에서이 방법을 사용합니다.

마지막으로 bg 내장 쉘 명령을 .

프로그램을 시작하기 만하면 프로그램을 일시 중지하거나 백그라운드로 유지하려면 CTRL + Z를 입력하십시오.

$ thecommand
^Z
[1] Stopped          thecommand

이제 백그라운드에서 계속 실행하십시오.

$ bg
[1]+ thecommand &

프로세스 정보를 살펴보면 아직 부모 프로세스가 있습니다.

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

따라서 현재 프로세스를 종료하십시오. 백그라운드에서 실행중인 프로세스는 원래 상위에서 연결 해제되고 백그라운드에서 계속 실행됩니다.

$ exit

다시 로그인하고 프로세스 정보를보십시오 :

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.