웹사이트 검색

연결이 끊어진 후에도 원격 SSH 세션과 프로세스를 계속 실행하는 5가지 방법


간단히 말해서 SSH 또는 Secure Shell은 사람이 다른 시스템의 다른 사용자에 원격으로 액세스할 수 있는 방법이지만 명령줄, 즉 비GUI 모드에서만 가능합니다. 보다 기술적인 용어로 말하면, 다른 시스템의 다른 사용자에게 SSH를 통해 접속하고 해당 시스템에서 명령을 실행하면 실제로 의사 터미널이 생성되어 로그인한 사용자의 로그인 셸에 연결됩니다.

세션에서 로그아웃하거나 꽤 오랫동안 유휴 상태인 후 세션 시간이 초과되면 SIGHUP 신호가 의사 터미널과 해당 터미널에서 실행된 모든 작업으로 전송됩니다. 의사 터미널에서 시작되는 상위 작업이 있는 작업에도 SIGHUP 신호가 전송되고 강제로 종료됩니다.

놓치지 마세요: SSH 서버를 안전하게 보호하는 5가지 유용한 방법

이 신호를 무시하도록 구성된 작업만이 세션 종료 후에도 살아남는 작업입니다. Linux 시스템에서는 사용자 로그아웃 및 세션 종료 후에도 이러한 작업이 원격 서버 또는 모든 시스템에서 실행되도록 하는 다양한 방법이 있습니다.

Linux의 프로세스 이해

정상적인 과정

일반 프로세스는 세션 수명이 있는 프로세스입니다. 세션 중에 포그라운드 프로세스로 시작되어 특정 시간 범위 또는 세션이 로그아웃될 때 종료됩니다. 이러한 프로세스의 소유자는 루트를 포함하여 시스템의 유효한 사용자입니다.

고아 프로세스

고아 프로세스는 처음에는 프로세스를 생성한 상위 프로세스가 있었지만 일정 시간이 지나면 상위 프로세스가 의도치 않게 종료되거나 충돌하여 init가 해당 프로세스의 상위 프로세스가 되는 프로세스입니다. 이러한 프로세스는 해당 프로세스가 죽거나 종료될 때까지 대기하는 직계 부모로서 init를 갖습니다.

데몬 프로세스

이는 의도적으로 분리된 프로세스로, 시스템에서 의도적으로 실행 중인 프로세스를 데몬 또는 의도적으로 분리된 프로세스라고 합니다. 일반적으로 한 번 시작된 후 제어 터미널에서 분리되어 완료되지 않거나 오류가 발생할 때까지 백그라운드에서 실행될 수 있는 장기 실행 프로세스입니다. 이러한 프로세스의 부모는 의도적으로 죽어서 자식이 백그라운드에서 실행됩니다.

연결이 끊어진 후에도 SSH 세션을 계속 실행하는 기술

아래에 설명된 대로 연결 해제 후 SSH 세션을 실행 상태로 두는 다양한 방법이 있을 수 있습니다.

1. screen 명령을 사용하여 SSH 세션 실행 유지

screen은 사용자가 동시에 여러 터미널 세션을 관리하고, 세션 간 전환하고, 화면에서 실행 중인 세션에 대한 세션 로깅을 기록하고, 원하는 시간에 세션을 재개할 수도 있는 Linux용 텍스트 창 관리자입니다. 세션이 로그아웃되거나 터미널이 닫힐 염려가 없습니다.

스크린 세션을 시작한 다음 제어 터미널에서 분리하여 백그라운드에서 실행되도록 한 다음 언제 어디서나 재개할 수 있습니다. 화면에서 세션을 시작하고 원할 때 의사 터미널(또는 제어 터미널)에서 세션을 분리하고 로그아웃하면 됩니다. 기분이 좋으면 다시 로그인하여 세션을 재개할 수 있습니다.

스크린 세션 시작

'screen' 명령을 입력하면 새 화면 세션이 시작됩니다. 이 세션 내에서 새 창을 만들고, 창 사이를 이동하고, 화면을 잠그는 등 더 많은 작업을 수행할 수 있습니다. 일반 터미널.

screen

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

스크린 분리

원격 세션에서 로그아웃하고 싶지만 해당 컴퓨터에서 생성한 세션을 유지하고 싶다면 제어 터미널이 남지 않도록 터미널에서 화면을 분리하기만 하면 됩니다. 이 작업을 수행한 후 안전하게 로그아웃할 수 있습니다.

원격 터미널에서 화면을 분리하려면 “Ctrl+a ”를 바로 누르고 “d ”를 누르세요. 그러면 터미널로 돌아가서 화면에 메시지가 표시된다는 메시지가 표시됩니다. 분리되어 있습니다. 이제 안전하게 로그아웃할 수 있으며 세션은 활성 상태로 유지됩니다.

분리된 화면 세션 재개

로그아웃하기 전에 나간 분리된 화면 세션을 재개하려면 원격 터미널에 다시 로그인하고 화면이 하나만 열려 있는 경우 “screen -r ”를 입력하고 여러 화면이 열려 있는 경우 스크린 세션이 열리면 “screen -r 를 실행하세요.

screen -r
screen -r <pid.tty.host>

screen 명령 및 사용 방법에 대해 자세히 알아보려면 screen 명령을 사용하여 Linux 터미널 세션 관리 링크를 따르십시오.

2. Tmux(터미널 멀티플렉서)를 사용하여 SSH 세션 실행 유지

Tmuxscreen을 대체하기 위해 만들어진 또 다른 소프트웨어입니다. screen의 기능 대부분을 갖추고 있으며 screen보다 더 강력한 추가 기능은 거의 없습니다.

화면에서 제공하는 모든 옵션 외에도 여러 창 간에 창을 수평 또는 수직으로 분할하고 창 크기를 조정하고 세션 활동 모니터링, 명령줄 모드를 사용한 스크립팅 등을 허용합니다. tmux의 이러한 기능으로 인해 거의 널리 채택되었습니다. 모든 Unix 배포판은 물론 OpenBSD의 기본 시스템에도 포함되었습니다.

Tmux 세션 시작

원격 호스트에서 ssh를 수행하고 tmux를 입력하면 새 창이 열려 있는 새 세션에 들어가게 되며 여기서 일반 터미널에서 수행하는 모든 작업을 수행할 수 있습니다.

tmux

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

터미널에서 Tmux 세션 분리

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

tmux detach

닫힌 Tmux 세션 재개

분리하고 시스템에서 로그아웃할 때 그대로 떠난 세션을 다시 열려면 원격 시스템에 다시 로그인하고 “tmux attachment”를 입력하여 닫힌 세션에 다시 연결하면 됩니다. 여전히 거기에 있고 달릴 것입니다.

tmux attach

tmux 및 사용 방법에 대해 자세히 알아보려면 Tmux 터미널 멀티플렉서를 사용하여 여러 Linux 터미널 관리 링크를 따르십시오.

3. nohup 명령을 사용하여 SSH 세션 계속 실행

screen 또는 tmux에 익숙하지 않은 경우 nohup을 사용하고 장기 실행 명령을 백그라운드로 보내면서 계속할 수 있습니다. 명령은 백그라운드에서 계속 실행됩니다. 그 후에는 안전하게 로그아웃할 수 있습니다.

nohup 명령을 사용하면 종료 시 ssh 세션에서 전송되는 SIGHUP 신호를 무시하도록 프로세스에 지시하여 세션 로그아웃 후에도 명령이 지속되도록 합니다. 세션 로그아웃 시 명령은 터미널 제어에서 분리되고 백그라운드에서 데몬 프로세스로 계속 실행됩니다.

백그라운드에서 nohup을 사용하여 명령 실행

다음은 nohup을 사용하여 ssh 세션에서 백그라운드에서 파일을 검색하기 위해 find 명령을 실행한 후 PID 작업을 즉시 반환하는 프롬프트와 함께 작업이 백그라운드로 전송된 간단한 시나리오입니다. 프로세스 ([JOBID] PID)의 >ID입니다.

nohup find / -type f $gt; files_in_system.out 2>1 &

작업이 아직 실행 중인지 확인하기 위해 세션을 재개하는 중

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

fg %JOBID

4. disown 명령을 사용하여 SSH 세션 실행 유지

명령이나 단일 작업을 백그라운드에서 실행하고 세션 로그아웃이나 연결 해제 후에도 활성 상태를 유지하는 또 다른 우아한 방법은 disown을 사용하는 것입니다.

Disown, 시스템의 프로세스 작업 목록에서 작업을 제거합니다. 따라서 세션 연결이 끊어지는 동안 프로세스가 종료되는 것을 방지합니다. 로그아웃하세요.

이 방법의 단점은 특별히 리디렉션하지 않는 한 stdin의 입력이 필요하지 않고 stdout에 쓸 필요가 없는 작업에만 사용해야 한다는 것입니다. 작업 입력 및 출력. 작업이 stdin 또는 stdout과 상호작용을 시도하면 중지되기 때문입니다.

백그라운드에서 disown을 사용하여 명령 실행

아래에서는 ut가 계속 실행되고 작업 목록에서 제거되도록 ping 명령을 백그라운드로 보냈습니다. 표시된 대로 작업이 처음 일시중단된 후 여전히 작업 목록에 프로세스 ID: 15368로 남아 있습니다.

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

해당 거부 신호가 작업에 전달된 후 작업 목록에서 제거되었지만 여전히 백그라운드에서 실행 중이었습니다. 아래와 같이 원격 서버에 다시 로그인해도 작업은 계속 실행됩니다.

ps -ef | grep ping

5. setid 명령을 사용하여 SSH 세션 실행

필요한 동작을 달성하기 위한 또 다른 유틸리티는 setsid입니다. Nohup은 프로세스의 프로세스 그룹이 동일하게 유지되므로 nohup으로 실행되는 프로세스가 전체 프로세스 그룹으로 전송되는 모든 신호(예: Ctrl + C<)에 취약하다는 점에서 단점이 있습니다. /코드>).

반면 setsid는 실행 중인 프로세스에 새 프로세스 그룹을 할당하므로 생성된 프로세스는 완전히 새로 할당된 프로세스 그룹에 속하며 세션 로그아웃 후에도 종료될 염려 없이 안전하게 실행할 수 있습니다.

setid를 사용하여 모든 명령을 실행합니다.

여기서는 'sleep 10m' 프로세스가 생성된 이후 제어 터미널에서 분리되었음을 보여줍니다.

setsid sleep 10m
ps -ef | grep sleep

이제 세션에 다시 로그인하면 이 프로세스가 계속 실행되는 것을 볼 수 있습니다.

ps -ef | grep [s]leep

결론

SSH 세션에서 로그아웃한 후에도 프로세스를 계속 실행하려면 어떤 방법을 생각할 수 있습니까? 당신이 생각할 수 있는 다른 효율적인 방법이 있다면 댓글에 언급해 주세요.