실행중인 프로세스를 제거하고 새 화면 셸에 연결하려면 어떻게해야합니까?


159

SSH 셸에서 실행중인 프로그램이 있습니다. 일시 중지하고 돌아올 때 실행을 일시 중지 할 수 있기를 원합니다.

내가 생각한 한 가지 방법은 소유권을 화면 셸로 옮기는 것입니다.

다른 방법으로 진행할 수 있습니까?


8
이미 시작된 프로세스를 nohup / screen 할 수 있습니까?를 참조하십시오 . 드롭 된 SSH 세션에서 실행중인 명령재개 합니다. 여기서는 현재 언급되지 않은 여러 ptrace 기반 솔루션을 언급합니다.
Gilles

unix.stackexchange.com/a/4039/13496 과 같은 질문에서 rettyneercs 에 대해 듣고 있습니다. 흠 ...는 "같은 떨어지게 거기 궁금해 경우 화면 내가 프로세스 다음 번에 실행하기 전에 여기에서"계층은 내가 쉽게 표준 입력 / 출력 / 잘못을 다시 스냅 할 것, 미래에 상단 터미널을 잃게한다
마르코스

이 질문에서 부적절 할 수없는 2 차 / 암시 적 문제는 ... 왜 백그라운드 에서 stdin을 필요로하지 않거나 기다릴 필요가없는 백그라운드 에서 새로운 / 방금 시작된 작업이있을 때 쉘이 일시 중단 된 작업을 제거하도록 선택 했습니까? 이것은 내가 겪었던 치료법이므로 여기서 무엇이 달라 졌는지 모릅니다.
Marcos

답변:


86

GNU를 사용하는 screen것이 가장 좋습니다.

화면 실행을 시작하면 처음 로그인 - 나는 실행 screen -D -R, 명령을 실행하거나 분리 또는 그것을 중단 CTRL-Z하고 눌러 화면에서 분리 CTRL-A한 후 D.

컴퓨터에 다시 로그인하면을 실행하여 다시 연결하십시오 screen -D -R. 당신은 이전과 같은 껍질에있을 것입니다. jobs일시 중단 된 프로세스가있는 경우 실행 하여 프로세스를 다시 볼 수 있습니다 %1(또는 해당 작업 #).


2
와우, 나는 GNU 화면에 대한 답변이 현재 가장 낮은 등급이라고 믿을 수 없습니다. 뭔가 빠졌습니까?
Faheem Mitha

1
혹시! 나에게 최고인 것 같습니다.
앤드류 요훔

1
되돌아 보면, 화면 환경 내에서 계획을 세우고 프로세스를 시작할 수 있다면 가장 고통스러운 솔루션 인 것 같습니다. 어쨌든, 나는 그것을 공식 답변으로 만들었습니다!
levesque

28
나는 이것이 질문에 대답하지 않는다고 생각합니다. 질문은 " 프로그램이 실행 중입니다 "로 시작합니다. 이 답변은 아직 실행되고 있지 않다고 가정합니다.
Anko

예 그는 분명히 그가 화면 세션 :-)에 그것을하고 싶어 썼다
플로리안 Heigl의

112

disown내장 된 쉘에서 프로그램의 "소유권"을 취소 할 수 있습니다 .

# press Ctrl+Z to suspend the program
bg
disown

그러나 이것은 SIGHUP쉘이 종료 할 때 프로그램에 신호를 보내지 않도록 쉘에게 지시합니다 . 프로그램은 일반적으로 표준 입력, 출력 및 오류 스트림으로 터미널과의 모든 연결을 유지합니다. 다른 터미널에 다시 연결할 수있는 방법이 없습니다. ( 화면 은 각 창마다 터미널을 에뮬레이트하여 작동하므로 프로그램이 화면 창에 연결됩니다.)


디버거에 프로그램을 연결 (예 :)하고 , 및을 ptrace호출 하여 파일 설명자를 다른 파일에 다시 첨부 할 수 있습니다 . 이를 수행하는 몇 가지 도구가 있습니다. 이것은 까다로운 프로세스이며 때로는 프로세스를 중단시킬 수 있습니다. 가능성은 (에 대한 답변에서 수집 한 링크를 포함 제가 실행중인 프로세스를 부인하고 새 화면 쉘에 연결할 수 있습니다 어떻게? 그리고 나는 이미 시작 프로세스를 화면 nohup을 / 수 있습니까? )opendupclose


disown작업 제어 목록에서 프로세스를 제거합니다.
ctrl-alt-delor


@CeesTimmerman 쉘의 작업 테이블에 작업을 남겨 두지 만 그 장점은 무엇입니까?
Gilles

@Gilles : 그래도 여전히 fg또는 kill그 자체로 끝날 수 있는지 확인할 수 있습니다.
Peter Cordes

언급 된 유틸리티는 프로세스 그룹과 함께 작동 bzcat a.bz2 | grep text합니까 (예 :) ? Man for reptyr는 아이들과 함께 프로세스를 옮기는 것을 지원하지 않는다고 말합니다.
dma_k

64

터미널간에 프로세스를 이동하거나 사용하지 않는 사람을 다시 연결하려면 예를 들어 reptyr을 사용할 수 있습니다 .


1
네, 감사합니다! 필자는 저자의 웹 사이트에서 유사하거나 오래된 도구보다 어떻게 작동하는지 읽었습니다. ncurses 프로그램 용.
Marcos

4
대단하다. 그것은 ssh에서 똑바로 달리고 기차를 타야하여 친구의 일을 끊임없이 잃어 버리는 친구의 어려움을 해결해야합니다. "죄송합니다. 화면 사용을 잊어 버렸습니다. 다시."
Adam Katz

3
+1 허용되는 screen답변은 물론 이상적이지만 실제로 현재 실행중인 프로세스 등으로 이동 하는 방법을 요청하는 질문에 대한 답변은 아닙니다 screen. 또한이 답변을 참조하십시오 : serverfault.com/a/284795
toxefa

1
절대 라이브 세이버. 사용자 확인을 기다리고있는 적절한 dist-upgrade를 다시 첨부 할 수있었습니다.
andig

28

내가 가장 좋아하는 솔루션은을 사용하는 것입니다 tmux. 세션을 분리하고 다른 터미널에 다시 연결할 수 있습니다.

이전 세션에서 분리하면 터미널을 안전하게 닫을 수 있습니다. 나중에 tmux attach로그 아웃하더라도 세션으로 돌아 오는 데 사용 합니다.


1
당신은 또한 당신의 친구와 세션을 공유하고 여러 창과 창 등을 사용할 수 있습니다! 사랑합니다 ^ _ ^
igor


21

실행중인 프로그램을 다른 터미널에 다시 연결할 수있는 retty 라는 작은 유틸리티도 있습니다.


19

나는 정기적으로 사용하지 않지만 neercs 는 이것을 지원한다고 주장합니다. 그것은의 screen더 나은 창 관리와 같은 기타 멋진 기능 -like 프로그램 만이 제공하는 중요한 점은 창으로 프로세스를 가져올 수있는 기능입니다


2
흥미 롭군 더티 ( ptrace)를 재생 하지만 파일 디스크립터를 조작 할뿐 아니라 프로세스를 분기시킵니다. 그것은 잡을 수 find /있지만 대화 형 bash가 충돌했습니다.
Gilles

@Gilles 시도했을 때 어떻게되었는지 기억이 나지 않지만, 평판이 좋지 않습니다. 꽤 정기적으로 실패한다고 들었습니다.
Michael Mrozek

9

일시 중지하고 나중에 다시 시작하려는 경우 killwith STOP또는 CONTsignal을 사용할 수 있습니다 .

처음에는 프로세스 PID를 찾아

$ ps aux

그런 다음 프로세스에 나열된 PID로 신호를 보냅니다.

$ kill -STOP <PID>

$ kill -CONT <PID>

9

ThomasHabets의 "injcode"가 정확히 필요한 것 같습니다.

https://github.com/ThomasHabets/injcode

injcode 프로그램을 사용하면 미리 알고 화면 또는 tmux를 실행했는지 여부에 관계없이 임의의 코드를 실행중인 프로세스에 삽입 할 수 있습니다.

읽어보기에서 :

예 1 : 한 터미널에서 다른 터미널로 irssi 이동

화면으로 옮길 수도 있습니다.

첫 번째 터미널에서 irssi를 시작하십시오.

다른 터미널에서 injcode를 실행하십시오 : $ injcode -m retty

Irssi는 이제 새로운 제어 터미널을 포함하여 두 번째 터미널로 이동해야합니다.


1

이것은 나를 위해 일했다 :

  1. bg 과정
  2. jobs -l 프로세스 번호 찾기
  3. tmux 쉘 창 관리자 시작
  4. 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.