연결 해제 후 원격 SSH 세션 및 프로세스 실행을 유지하는 5 가지 방법
간단히 말해 SSH 또는 Secure Shell은 사용자가 다른 시스템의 다른 사용자에 원격으로 액세스 할 수있는 방법이지만 명령 줄 (예 : 비 GUI 모드)에서만 가능합니다. 좀 더 기술적 인 용어로 말하자면, 우리가 다른 시스템의 다른 사용자에게 ssh로 연결하고 해당 컴퓨터에서 명령을 실행하면 실제로 의사 터미널을 만들어 로그인 한 사용자의 로그인 셸에 연결합니다.

세션에서 로그 아웃하거나 오랜 시간 동안 유휴 상태로 세션 시간이 초과되면 SIGHUP 신호가 의사 터미널과 해당 터미널에서 실행 된 모든 작업, 심지어 부모 작업이있는 작업까지 전송됩니다. 의사 터미널에서 시작되는 것도 SIGHUP 신호를 보내고 강제 종료됩니다.
이 신호를 무시하도록 구성된 작업 만 세션 종료 후에도 유지됩니다. Linux 시스템에서는 사용자 로그 아웃 및 세션 종료 후에도 원격 서버 또는 모든 시스템에서 이러한 작업을 실행할 수있는 다양한 방법이 있습니다.
Linux의 프로세스 이해
정상적인 프로세스는 세션의 수명이있는 프로세스입니다. 세션 중에 포 그라운드 프로세스로 시작되고 특정 시간 범위 또는 세션이 로그 아웃 될 때 종료됩니다. 이러한 프로세스는 루트를 포함하여 시스템의 유효한 사용자로 소유자를 갖습니다.
고아 프로세스는 처음에는 프로세스를 생성 한 부모가 있었지만 얼마 후 부모 프로세스가 의도하지 않게 종료되거나 충돌하여 init가 해당 프로세스의 부모가 된 프로세스입니다. 이러한 프로세스는 이러한 프로세스가 죽거나 끝날 때까지 대기하는 직계 부모로 init를 가지고 있습니다.
이러한 프로세스는 의도적으로 분리 된 프로세스이며 시스템에서 의도적으로 실행중인 프로세스를 데몬 또는 의도적으로 분리 된 프로세스라고합니다. 일반적으로 한 번 시작된 다음 제어 터미널에서 분리되어 완료되지 않거나 오류가 발생할 때까지 백그라운드에서 실행할 수있는 장기 실행 프로세스입니다. 이러한 프로세스의 부모는 의도적으로 사망하여 자식이 백그라운드에서 실행됩니다.
연결이 끊긴 후에도 SSH 세션을 계속 실행하는 기술
아래에 설명 된대로 연결이 끊긴 후 ssh 세션을 계속 실행하는 방법은 여러 가지가 있습니다.
screen은 사용자가 동시에 여러 터미널 세션을 관리하고, 세션을 전환하고, 화면에서 실행중인 세션에 대한 세션을 로깅하고, 세션이 로깅되는 것에 대해 걱정하지 않고 원하는 시간에 세션을 재개 할 수있는 텍스트 Window Manager for Linux입니다. 밖으로 또는 터미널이 닫힙니다.
화면 세션을 시작하고 제어 터미널에서 분리하여 백그라운드에서 실행 한 다음 언제 어디서나 다시 시작할 수 있습니다. 화면에서 세션을 시작하고 원할 때 의사 터미널 (또는 제어 터미널)에서 세션을 분리하고 로그 아웃하면됩니다. 기분이 들면 다시 로그인하여 세션을 재개 할 수 있습니다.
'screen'명령을 입력하면 새 화면 세션에 들어가게됩니다.이 세션 내에서 새 창을 만들고, 창 사이를 이동하고, 화면을 잠그고, 일반 터미널에서 할 수있는 더 많은 작업을 수행 할 수 있습니다.
$ screen

스크린 세션이 시작되면 모든 명령을 실행하고 세션을 분리하여 세션을 계속 실행할 수 있습니다.

원격 세션에서 로그 아웃하고 싶지만 해당 머신에서 생성 한 세션을 그대로 유지하고 싶은 경우, 제어 터미널이 남지 않도록 터미널에서 화면을 분리하면됩니다. 이렇게하면 안전하게 로그 아웃 할 수 있습니다.
원격 터미널에서 화면을 분리하려면 “Ctrl + a”
바로 다음에 “d”
를 누르십시오. 그러면 화면이 표시되는 메시지가 표시된 터미널로 돌아갑니다. "분리됩니다. "이제 안전하게 로그 아웃 할 수 있으며 세션은 계속 유지됩니다.

로그 아웃하기 전에 나간 분리 된 화면 세션을 재개하려면 원격 터미널에 다시 로그인하고 하나의 화면 만 열려있는 경우 “screen -r”
을 입력하고 여러 화면이 screen 세션이 열리고 “screen -r
를 실행합니다.
$ screen -r $ screen -r <pid.tty.host>

화면 명령 및 사용 방법에 대해 자세히 알아 보려면 다음 링크를 따르십시오. 화면 명령을 사용하여 Linux 터미널 세션 관리
Tmux는 화면을 대체하기 위해 만들어진 또 다른 소프트웨어입니다. 화면보다 강력하게 만드는 추가 기능은 거의 없지만 화면의 대부분의 기능을 가지고 있습니다.
화면에서 제공하는 모든 옵션과는 별도로 여러 창 사이에 창을 가로 또는 세로로 분할하고 창 크기를 조정하고 세션 활동 모니터링, 명령 줄 모드를 사용한 스크립팅 등을 허용합니다. 모든 유닉스 배포판과 심지어 OpenBSD의 기본 시스템에 포함되었습니다.
원격 호스트에서 ssh를 수행하고 tmux를 입력 한 후에는 새 창이 열리는 새 세션에 들어갑니다. 여기서 일반 터미널에서 수행하는 모든 작업을 수행 할 수 있습니다.
$ tmux

터미널에서 작업을 수행 한 후 제어 터미널에서 해당 세션을 분리하여 백그라운드로 들어가 안전하게 로그 아웃 할 수 있습니다.

실행중인 tmux 세션에서 “tmux detach”
를 실행하거나 단축키 (Ctrl + b 다음에 d)
를 사용할 수 있습니다. 이 후 현재 세션이 분리되고 안전하게 로그 아웃 할 수있는 터미널로 돌아갑니다.
$ tmux detach

분리하고 시스템에서 로그 아웃했을 때 그대로 두었던 세션을 다시 열려면 원격 컴퓨터에 다시 로그인하고 \"tmux attach\"를 입력하여 닫힌 세션에 다시 연결하면 계속 실행됩니다. ".
$ tmux attach

tmux 및 사용 방법에 대해 자세히 알아 보려면 Tmux 터미널 멀티플렉서를 사용하여 여러 Linux 터미널 관리 링크를 따르십시오.
screen 또는 tmux에 익숙하지 않은 경우 nohup을 사용하고 장기 실행 명령을 백그라운드로 보내 명령이 백그라운드에서 계속 실행되는 동안 계속할 수 있습니다. 그 후에 안전하게 로그 아웃 할 수 있습니다.
nohup 명령을 사용하면 종료시 ssh 세션에서 보낸 SIGHUP 신호를 무시하도록 프로세스에 지시하여 세션 로그 아웃 후에도 명령이 지속되도록합니다. 세션 로그 아웃시 명령은 제어 터미널에서 제거되고 데몬 프로세스로 백그라운드에서 계속 실행됩니다.
다음은 nohup을 사용하여 ssh 세션에서 백그라운드에서 파일을 검색하기 위해 find 명령을 실행 한 후 프로세스 ([ "JOBID] PID)
.
# nohup find / -type f $gt; files_in_system.out 2>1 &

다시 로그인하면 명령 상태를 확인하고 'fg % JOBID'
를 사용하여 다시 포 그라운드로 가져와 진행 상황을 모니터링 할 수 있습니다. 아래의 출력은 작업이 다시 로그인 할 때 표시되지 않고 표시되는 출력을 제공하여 완료되었음을 보여줍니다.
# fg %JOBID

명령 또는 단일 작업을 백그라운드에서 실행하고 세션 로그 아웃이나 연결이 끊긴 후에도 살아남는 또 다른 우아한 방법은 disown을 사용하는 것입니다.
Disown은 시스템의 프로세스 작업 목록에서 작업을 제거하므로 로그 아웃 할 때 셸에서 SIGHUP를 수신하지 않으므로 세션 연결이 끊어지는 동안 프로세스가 종료되지 않도록 보호됩니다.
이 방법의 단점은 작업이 stdin과 상호 작용을 시도 할 때 작업 입력 및 출력을 특별히 리디렉션하지 않는 한 stdin의 입력이 필요하지 않고 stdout에 쓸 필요가없는 작업에만 사용해야한다는 것입니다. "또는 stdout, 중지됩니다.
아래에서는 ut이 계속 실행되고 작업 목록에서 제거되도록 ping 명령을 백그라운드로 보냈습니다. 보시다시피 작업이 처음 일시 중지 된 후 프로세스 ID : 15368로 작업 목록에 계속 남아 있습니다.
$ ping tecmint.com > pingout & $ jobs -l $ diswon -h %1 $ ps -ef | grep ping

그 후 disown 신호가 작업에 전달되고 작업 목록에서 제거되었지만 여전히 백그라운드에서 실행 중이었습니다. 아래와 같이 원격 서버에 다시 로그인하면 작업이 계속 실행됩니다.
$ ps -ef | grep ping

필요한 동작을 수행하는 또 다른 유틸리티는 setsid입니다. Nohup은 프로세스의 프로세스 그룹이 동일하게 유지되므로 nohup으로 실행되는 프로세스가 전체 프로세스 그룹 (예 : Ctrl + C
)으로 전송되는 신호에 취약하다는 점에서 단점이 있습니다.
반면에 setsid는 실행중인 프로세스에 새 프로세스 그룹을 할당하므로 생성 된 프로세스는 완전히 새로 할당 된 프로세스 그룹에 있으며 세션 로그 아웃 후에도 종료 될 염려없이 안전하게 실행할 수 있습니다.
여기서는 ‘sleep 10m’
프로세스가 생성 된 시점부터 제어 터미널에서 분리되었음을 보여줍니다.
$ setsid sleep 10m $ ps -ef | grep sleep

이제 세션에 다시 로그인하면이 프로세스가 계속 실행중인 것을 알 수 있습니다.
$ ps -ef | grep [s]leep

결론
SSH 세션에서 로그 아웃 한 후에도 프로세스를 계속 실행할 수있는 방법은 무엇입니까? 생각할 수있는 다른 효율적인 방법이 있으면 의견에 언급하십시오.