ssh 세션에서 많은 프로세스를 시작한다고 가정 해 봅시다. 원격 시스템에서 해당 프로세스를 계속 실행하면서 ssh 세션을 종료 할 수 있습니까?
ssh 세션에서 많은 프로세스를 시작한다고 가정 해 봅시다. 원격 시스템에서 해당 프로세스를 계속 실행하면서 ssh 세션을 종료 할 수 있습니까?
답변:
같은 현대적인 대안을 찾아야합니다 tmux
.
tmux
screen
여러 가지 이유로 우월합니다 . 여기에 몇 가지 예가 있습니다.
답변 권장 사항 에서 설명한 것과 동일한 기능을 사용 screen
하려면 다음을 수행해야합니다.
tmux
에 입력하여 시작tmux
tmux
세션 내에서 원하는 프로세스를 시작하십시오.tmux
를 입력 하여 세션을 종료 / 분리 한 다음Ctrlbd 이제 원격 시스템에서 안전하게 로그 오프 할 수 있습니다 tmux
. 프로세스는 내부에서 계속 실행됩니다 . 다시 돌아와서 프로세스 상태를 확인하려면 세션 tmux attach
에 연결하는 데 사용할 수 있습니다 tmux
.
당신이 나란히 실행하는 여러 세션을 원한다면, 당신은 사용하여 각 세션의 이름을해야 Ctrl+ b와 $
. 을 사용하여 현재 실행중인 세션 목록을 얻을 수 있습니다 tmux list-sessions
. 이제 명령으로 실행중인 세션에 연결하십시오 tmux attach-session -t 0
.
tmux
단일 세션에서 단일 창을 처리하는 것보다 훨씬 더 고급 작업을 수행 할 수 있습니다. 자세한 내용은의 모습이 man tmux
나 TMUX GitHub의 페이지를 . 특히와 의 주요 차이점에 대한 FAQ 는 다음 screen
과 같습니다 tmux
.
screen -x -r [screenname]
또는 screen -rx
짧게 사용하십시오 . 이를 통해 기존 화면 인스턴스를 연결할 수 있습니다.
Ctrl-b
하고 나서야한다고 확신합니다 . 확실히 내 우분투 12.04 버전의 경우입니다 . d
tmux
tmux
tmux detach
타이핑 대신 실행ctrl-b d
nohup
가장 좋은 방법은 종종 가장 간단합니다.
nohup long-running-command &
이를 위해 특별히 만들어졌으며 stdout에로 기록합니다 nohup.log
.
man nohup
bg
이미 실행중인 일부 작업을 "배경"으로하려면 가장 좋은 방법은 Ctrl+ Z를 실행하는 것입니다.
bg
가장 최근에 일시 중단 된 작업을 백그라운드로 전환하여 계속 실행할 수 있습니다.
그런 다음 disown
로그 아웃 한 후에도 프로세스를 빠르게 실행해야합니다.
screen
그리고 다른 사람들도 그렇게 할 수 있지만 그것은 그들이 원하는 것이 아닙니다. nohup
남겨두고 bg
싶은 작업과 이미 실행 중이고 다시 시작하고 싶지 않은 작업에 권장 합니다 .
명심하십시오, 둘 다 bash 특정 적입니다. bash를 사용하지 않으면 명령이 다를 수 있습니다.
disown -h
bg
+ disown
나를 위해 작동하지 않았다. 나는 tmux에서 시작하는 것을 잊어 버린 배포 스크립트를 가지고 있었고 회의를 위해 일찍 떠나야했습니다. 스크립트는 계속해서 진행 상황을 쉘에 출력합니다. ctrl+z
프로세스를 멈추고 bash로 돌아 왔습니다. bg
프로세스를 다시 시작했지만 상태를 bash로 다시 출력하여 입력 한 내용을 볼 수 없었습니다. 그러나 disown
명령은 "disown : current : no such job"을 생성했습니다.
julia myFile.jl
어떤 이유로 든 나를 위해 작동하지 않았습니다 . tmux는 훌륭합니다.
을 사용하여 그렇게 할 수 screen
있습니다.
man screen
자세한 내용을 보거나이 화면 맨 페이지를 읽으려면 입력 하십시오 .
간단한 시나리오 :
당신의 원격 상자에 ssh. 입력 screen
한 다음 원하는 과정을 시작합니다.
Ctrl-를 A누른 다음 Ctrl-를 누르십시오 D. 그러면 화면 세션이 "분리"되지만 프로세스는 계속 실행됩니다. 이제 원격 박스에서 로그 아웃 할 수 있습니다.
나중에 다시 방문하려면 다시 로그온 한 screen -r
다음 화면 세션을 "다시 시작합니다"라고 입력 하면 프로세스의 출력을 볼 수 있습니다.
screen -S name
나중에 올바른 세션에 더 쉽게 연결할 수 있도록 화면 세션 이름 을 사용합니다.
screen -S
휴가 전과 screen -r
돌아올 때의 조합 은 놀랍습니다!
Screen and nohup이 더 좋은 방법이지만 screen 또는 nohup없이 이미 실행중인 프로세스를 분리해야하는 경우 disown 명령을 실행할 수 있습니다.
disown [-ar] [-h] [
jobspec
… |
pid
… ]
옵션이 없으면 활성 작업 테이블에서 각 작업 스펙 을 제거하십시오 . 경우
-h
옵션이 주어 작업이 테이블에서 제거되지 않습니다 만, 쉘이 SIGHUP를 수신하는 경우 그 SIGHUP이 작업에 전송되지 않도록 표시됩니다. 경우 jobspec이 존재하지 않고, 어느 것도-a
나-r
옵션이 제공되어, 현재 작업이 사용됩니다. jobspec 이 제공 되지 않으면 이-a
옵션은 모든 작업을 제거하거나 표시하는 것을 의미합니다.-r
없이 옵션 jobspec 인수 작업을 실행하는 작업을 제한합니다.
disown을 사용하면 터미널을 닫고 시스템에서 프로세스를 실행할 수 있습니다.
disown -a && exit
disown
.
큰 mv에 갇혀 프로세스, 설정 화면을 중지 한 다음 다시 시작하는 위치에 없었습니다. 본질적으로 다음 단계를 수행하여 프로세스가 실행되는 ssh 세션을 종료했습니다.
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.
disown
내장 명령은 가장 최근의 백그라운드 작업에서 작동합니다.
여러 ssh 연결을 통해 프로그램과 터미널 상태를 유지하는 데 사용할 수있는 두 가지 주요 프로그램이 있습니다. 그것들은 스크린 (현재는 있지만 불행히도 유지되지 않습니다. 현재 적극적으로 개발되고 있음 )과 tmux (새로운, 적극적으로 유지됨)입니다. Byobu는 이러한 시스템에서 실행할 수 있고 추가 우분투 상태 정보를 제공하는 프런트 엔드입니다. 새 설치에서는 tmux를 백엔드로 사용하며, byobu의 이전 설치 및 기존 구성이있는 경우 이전 백엔드 (스크린 또는 tmux)를 유지합니다.
Byobu는 데비안 기반 컴퓨터에서 설치하여 컴퓨터에 설치할 수 있습니다.
sudo aptitude install byobu
yum을 사용하면
su -c 'yum install byobu'
byobu를 다른 배포판에 설치할 수도 있습니다.
byobu
ssh를 사용하여 연결 한 후 호스트 시스템에서 실행 하여 byobu를 시작할 수 있습니다 . 이렇게하면 다음과 같은 쉘이 나타납니다.
또한 -X 옵션이있는 Ubuntu 시스템에서 Byobu 터미널을 사용하고 쉽게 byobu를 사용할 수 있습니다.
을 입력하여 byobu를 시작하십시오 byobu
.
F2를 눌러 현재 세션 내에서 새 창을 만들고 F3-F4를 사용하여 다양한 창 사이를 전환 할 수 있습니다.
byobu의 가장 좋은 점은 터미널에서 나가기 위해 터미널에서 실행중인 프로세스를 실제로 죽일 필요가 없다는 것입니다. 간단히 screen / tmux (byobu의 골격)를 배경으로 보내고 다음에 올 때 다시 시작할 수 있습니다.
다음에 오실 때는 그냥 byobu
하시면됩니다.
다양한 byobu 세션 등을 만들 수도 있습니다 byobu -S session1
. 돌아올 때 둘 중 하나에 연결할 수 있습니다.
Byobu를 사용하면 훨씬 더 많은 것을 할 수 있습니다. 그걸 써! 몇 가지 결정적인 안내서가 여기 에 있습니다 .
프로세스가 시작된 후에는이를 수행 할 수 없으므로 장기 실행 작업을 실행하기 전에 설정해야합니다.
nohup 을 사용할 수 있지만 현대의 지혜는 screen 또는 byobu를 로그인으로 사용하여 항목을 분리하고 계속 실행할 수 있도록 제안합니다.
Screen은 한 기계에서 분리하여 다른 기계에서 다시 부착 할 수 있다는 장점이 있습니다. 이는 작업 일이 끝날 때까지 실행되는 장기 실행 프로세스를 확인하려는 경우에 편리합니다.
여기에 합리적인 시작 안내서가 있습니다.
byobu 는 메뉴 등으로 화면 상단에 사용하기 쉬운 인터페이스를 제공합니다. 또한 최신 우분투에서 현재 화면 구현입니다. F2는 새 터미널을 시작하고 F3 / F4는 앞뒤로 전환하고 F6은 연결을 끊습니다. 실제로 터미널을 영구적으로 종료하려면 exit를 입력하십시오.
disown
이를 달성 하는 데 사용할 수 있습니다 . @bassgey의 답변보기
disown
다만 필요한 경우 Ctrl-z
, 다음 bg
이를 활성 터미널과 배경을 얻을 수 있습니다. 그런 다음, disown
.
나는 스크린이 가장 효과적인 옵션이라는 것에 동의했다. vncserver를 사용한 다음 프로세스를 시작할 수 있습니다.
또한 유일한 상호 작용이 프로세스를 실행하고 다시 제어 할 필요가 없으며, 가장 중요한 것은 세션을 닫고 프로세스가 이미 실행 중임을 인식하지 못했다면 운이 좋지 않은 경우 bash를 쉘로 사용했습니다.
먼저 Ctrl + Z와 bg % 1을 차례로 입력하여 프로세스를 백그라운드로 보내야합니다 (숫자는 작업 번호에 따라 다르지만 일반적으로 1이지만 작업 명령을 사용하여 쉽게 목록을 가져올 수 있습니다)
마지막으로 disown 명령을 호출합니다 (bgid 명령과 동일하게 jobid 뒤에옵니다).
이렇게하면 쉘과 백그라운드 프로세스 간의 부모-자식 관계가 제거되어 쉘이 종료 될 때 죽지 않게됩니다.
screen
있으며, 질문은 로그인 후 이벤트를 시작한 후 로그인하기 전에 프로세스를 계속 실행하는 방법에 대해 제기되었습니다. 위대한 답변 Jorge, 당신은 정말 나를 도와주었습니다! :)
bg
(하지 않고는 %1
기본이 현재 작업이기 때문에), 종종 충분하다
오랫동안 실행 한 단일 셸 스크립트의 경우 '&'를 사용하여 백그라운드에서 로그인하고 프로세스를 실행합니다.
예:
/path/to/my/script &
SSH 세션에서 로그 아웃하고 연결을 끊었습니다. 나중에 로그인해도 스크립트에서 지속적으로 데이터를 수집하여 입증 된대로 스크립트가 계속 실행됩니다.
&
로그 아웃하고 SSH 세션에 로그인하면 이와 같은 프로세스를 실행 하면 프로세스가 계속 실행 되지만 프로세스 의 출력 을 볼 수는 없기 때문 입니다 (스크립트에서 무언가가 에코 된 경우) 보이지는 않지만 파일을 쓰면 파일이있을 것입니다)
당신은 체크 아웃해야 GNU 화면 과 당신을하는 데 도움이되는지 확인합니다. 응용 프로그램을 실시간으로 실행해야하는 방법에 따라 해결하는 것보다 더 많은 문제가 발생할 수 있지만 적어도 세션을 마치지 않은 것처럼 다시 시작할 수 있습니다.
사용하는 방법 :
screen
첫 번째 시작 명령 을 사용하고 소개 메시지를 스크롤하면 터미널이 전달됩니다.screen -r
해당 세션을 재개하는 데 사용할 수 있습니다 . 한 번에 여러 개의 분리 된 화면 세션을 가질 수 있으며,이 경우 사용 가능한 세션 목록이 표시됩니다.화면 분할과 같은 다른 많은 옵션이 있으며 모든 바로 가기를 완전히 사용자 지정할 수 있습니다.
가장 간단한 답변 ...
ctrl + z는 실행중인 프로그램을 일시 중단합니다
"bg"는 백그라운드에서 실행됩니다
disown
또는 nohup
)이 일반적으로 SSH 세션이 끝난 후 공정을 계속 실행하지 않습니다.
모든 사람들이 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가 기본적으로 어떻게 동작하는지에 대해 약간의 지식을 밝힐 수 있습니까? 어쩌면 일부 시스템 관리자는 사용자의 프로세스에 시스템 과부하가 걸리지 않도록 대형 쉘의 기본값을 변경합니까?
불행히도 SSH 세션이 종료되면 tmux 또는 화면이 종료 될 수 있습니다. systemd
세션에서 로그 아웃하면 모든 자식 프로세스가 종료 되기 때문 입니다.
logind.conf
( /etc/systemd/logind.conf
) 에서이 설정을 변경할 수 있습니다 .
KillUserProcesses=no
https://unix.stackexchange.com/questions/490267의 답변에 감사드립니다 .