SSH 셸에서 실행중인 프로그램이 있습니다. 일시 중지하고 돌아올 때 실행을 일시 중지 할 수 있기를 원합니다.
내가 생각한 한 가지 방법은 소유권을 화면 셸로 옮기는 것입니다.
다른 방법으로 진행할 수 있습니까?
SSH 셸에서 실행중인 프로그램이 있습니다. 일시 중지하고 돌아올 때 실행을 일시 중지 할 수 있기를 원합니다.
내가 생각한 한 가지 방법은 소유권을 화면 셸로 옮기는 것입니다.
다른 방법으로 진행할 수 있습니까?
답변:
GNU를 사용하는 screen
것이 가장 좋습니다.
화면 실행을 시작하면 처음 로그인 - 나는 실행 screen -D -R
, 명령을 실행하거나 분리 또는 그것을 중단 CTRL-Z
하고 눌러 화면에서 분리 CTRL-A
한 후 D
.
컴퓨터에 다시 로그인하면을 실행하여 다시 연결하십시오 screen -D -R
. 당신은 이전과 같은 껍질에있을 것입니다. jobs
일시 중단 된 프로세스가있는 경우 실행 하여 프로세스를 다시 볼 수 있습니다 %1
(또는 해당 작업 #).
disown
내장 된 쉘에서 프로그램의 "소유권"을 취소 할 수 있습니다 .
# press Ctrl+Z to suspend the program
bg
disown
그러나 이것은 SIGHUP
쉘이 종료 할 때 프로그램에 신호를 보내지 않도록 쉘에게 지시합니다 . 프로그램은 일반적으로 표준 입력, 출력 및 오류 스트림으로 터미널과의 모든 연결을 유지합니다. 다른 터미널에 다시 연결할 수있는 방법이 없습니다. ( 화면 은 각 창마다 터미널을 에뮬레이트하여 작동하므로 프로그램이 화면 창에 연결됩니다.)
디버거에 프로그램을 연결 (예 :)하고 , 및을 ptrace
호출 하여 파일 설명자를 다른 파일에 다시 첨부 할 수 있습니다 . 이를 수행하는 몇 가지 도구가 있습니다. 이것은 까다로운 프로세스이며 때로는 프로세스를 중단시킬 수 있습니다. 가능성은 (에 대한 답변에서 수집 한 링크를 포함 제가 실행중인 프로세스를 부인하고 새 화면 쉘에 연결할 수 있습니다 어떻게? 그리고 나는 이미 시작 프로세스를 화면 nohup을 / 수 있습니까? )open
dup
close
disown
작업 제어 목록에서 프로세스를 제거합니다.
disown -h
?
fg
또는 kill
그 자체로 끝날 수 있는지 확인할 수 있습니다.
bzcat a.bz2 | grep text
합니까 (예 :) ? Man for reptyr
는 아이들과 함께 프로세스를 옮기는 것을 지원하지 않는다고 말합니다.
터미널간에 프로세스를 이동하거나 사용하지 않는 사람을 다시 연결하려면 예를 들어 reptyr을 사용할 수 있습니다 .
screen
답변은 물론 이상적이지만 실제로 현재 실행중인 프로세스 등으로 이동 하는 방법을 요청하는 질문에 대한 답변은 아닙니다 screen
. 또한이 답변을 참조하십시오 : serverfault.com/a/284795
내가 가장 좋아하는 솔루션은을 사용하는 것입니다 tmux
. 세션을 분리하고 다른 터미널에 다시 연결할 수 있습니다.
이전 세션에서 분리하면 터미널을 안전하게 닫을 수 있습니다. 나중에 tmux attach
로그 아웃하더라도 세션으로 돌아 오는 데 사용 합니다.
나는 정기적으로 사용하지 않지만 neercs 는 이것을 지원한다고 주장합니다. 그것은의 screen
더 나은 창 관리와 같은 기타 멋진 기능 -like 프로그램 만이 제공하는 중요한 점은 창으로 프로세스를 가져올 수있는 기능입니다
ptrace
)를 재생 하지만 파일 디스크립터를 조작 할뿐 아니라 프로세스를 분기시킵니다. 그것은 잡을 수 find /
있지만 대화 형 bash가 충돌했습니다.
ThomasHabets의 "injcode"가 정확히 필요한 것 같습니다.
https://github.com/ThomasHabets/injcode
injcode 프로그램을 사용하면 미리 알고 화면 또는 tmux를 실행했는지 여부에 관계없이 임의의 코드를 실행중인 프로세스에 삽입 할 수 있습니다.
읽어보기에서 :
예 1 : 한 터미널에서 다른 터미널로 irssi 이동
화면으로 옮길 수도 있습니다.
첫 번째 터미널에서 irssi를 시작하십시오.
다른 터미널에서 injcode를 실행하십시오 : $ injcode -m retty
Irssi는 이제 새로운 제어 터미널을 포함하여 두 번째 터미널로 이동해야합니다.
이것은 나를 위해 일했다 :
bg
과정jobs -l
프로세스 번호 찾기tmux
쉘 창 관리자 시작reptyr -L PROCESSNUMBER
reptyr
의는 -L
일이를 얻기 위해 필요했다 :
-L Like '-l', but also redirect the child's stdio to the slave.
이 오류로 인해 :
$ reptyr 30622
[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied
그리고 -L과 함께
$ reptyr -L 30622
Opened a new pty: /dev/pts/4