SSH Shell에서 실행중인 프로그램이 있습니다. 일시 중지하고 돌아올 때 실행을 일시 중지 할 수 있기를 원합니다.
내가 생각한 한 가지 방법은 소유권을 화면 셸로 이전하여 계속 실행하는 것입니다.
다른 방법으로 진행할 수 있습니까?
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
신호를 보내지 말라고 쉘에게 지시합니다. 프로그램은 일반적으로 표준 입력, 출력 및 오류 스트림으로 터미널과의 모든 연결을 유지합니다. 다른 터미널에 다시 연결할 수있는 방법이 없습니다. ( Screen 각 창마다 터미널을 에뮬레이트하여 작동하므로 프로그램이 화면 창에 연결됩니다.)
디버거에 프로그램을 연결 (예 : ptrace
사용)하고 open
, dup
및 close
. 이를 수행하는 몇 가지 도구가 있습니다. 이것은 까다로운 프로세스이며 때로는 프로세스를 중단시킬 수 있습니다. 가능성은 다음과 같습니다 (- 실행중인 프로세스를 제거하고 새 화면 셸에 연결하려면 어떻게해야합니까? 및 이미 시작된 프로세스를 Nohup/screen 할 수 있습니까? =) :
터미널간에 프로세스를 이동하거나 사용하지 않는 사람을 다시 연결하려면 예를 들어 reptyr .
내가 가장 좋아하는 솔루션은 tmux
를 사용하는 것입니다. 세션을 분리 한 후 다른 터미널에 다시 연결할 수 있습니다.
이전 세션에서 분리하면 터미널을 안전하게 닫을 수 있습니다. 나중에 tmux attach
로그 아웃해도 세션으로 돌아갑니다.
실행중인 프로그램을 다른 터미널에 다시 연결할 수있는 retty 라는 작은 유틸리티도 있습니다.
정기적으로 사용하지는 않지만 neercs 는 이것을 지원한다고 주장합니다. 더 나은 창 관리와 같은 기타 고급 기능을 갖춘 screen
와 같은 프로그램이지만, 제공하는 주요 기능은 프로세스를 창으로 가져 오는 기능입니다
일시 중지하고 나중에 다시 시작하려면 kill
또는 STOP
신호와 함께 CONT
를 사용할 수 있습니다.
처음에는 프로세스 PID를 찾아
$ ps aux
그런 다음 프로세스에 나열된 PID로 신호를 보냅니다.
$ kill -STOP <PID>
$ kill -CONT <PID>
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