Bash / ZSH : '삭제'취소


30

프로세스가 '삭제'된 후 쉘 작업 테이블에 프로세스를 '재 부착'하는 방법이 있습니까?

편집 : $ SEARCHENGINE은 완전히 실패합니다. 너무 좋아 보이지 않습니다.

답변:


16

리눅스 작업과 프로세스 소유권의 작동 방식을 고려할 때 채택 프로세스의 도움없이 프로세스를 다시 소유 할 수는 없습니다.

부모는 자식을 '파기'하고 'init'라는 프로세스에 의해 '채택'될 수 있습니다. 시스템 보안은 누군가가 다른 사람의 프로세스를 잡지 못하게합니다. 프로세스를 제거하면 프로세스는 제어 할 다른 사람 (초기)이됩니다. '사용자'는 여전히 프로세스를 종료 할 수 있지만 다시 되돌릴 수는 없습니다. init가 메일을 읽지 않기 때문에 프로세스를 반환하도록 init을 강제하려고 시도하는 것은 효과가 없을 것입니다.

말 그대로, "그렇게 하지마!"라는 대답으로 귀결됩니다.


1
이것은 옳지 않을 수 있습니다. 부모 프로세스는 종료를 제외하고는 자녀를 입양시킬 수 없습니다. 설명하는 동작은 자식 프로세스 (또는 부모가 죽으면이 중 일부를 자동으로 수행하는 커널)에서 트리거해야합니다. 프로세스는 자발적으로 아이를 입양 할 수 없지만 어느 것도 포기할 수 없습니다.
Gilles 'SO- 악마 그만

1
사과드립니다. 내 잘못. 너무 단순화되었습니다. bash 소스를 다시 실행하면 bash는 여전히 소유권을 유지하지만 sighup이 하위 프로세스로 전달되는 것을 방지합니다. 따라서 다시 가져올 수는 있지만 bash (아직)에는 내장되어 있지 않습니다. 어떤 이유로 나는 고아와 좀비를 거두는 것에 착수했다.
lornix

@lomix 예, 그러나 당신이 당신이 그것을 제거 한 쉘을 종료하면 1의 pid를 얻습니다. 그래서 당신의 추론은 유효합니다. 어쨌든 나
가려고

1
죄송하지만이 답변은 잘못되었습니다. 그냥 사용 reptyr하십시오 (사용 예는 내 대답을 참조하십시오).
Christian Pietsch 2016 년

18

불행히도 잘못된 프로세스를 제거 한 불행한 상황에 처한 사람에게는 도움이되지 않는다고 생각하지만 워크 플로에서 disown을 제거하고 다음과 같이 바꾸려면 다음과 같이하십시오.

https://github.com/nelhage/reptyr

모든 프로세스를 보호 할 수 있습니다 (예 : 화면 내로 이동).


2
음, 나는 reptyr과 함께 사용하지 않는 vim 프로세스를 다시 얻었으므로 내가 찾고 있던 undisown 유틸리티처럼 작동했습니다.
hlovdal 2013

당신은 맞습니다, @hlovdal :이 대답은 반 틀 렸습니다. reptyr해결책이지만 사용을 중지 할 필요는 없습니다 disown. 명확하게하기 위해 새로운 답변을 작성했습니다.
Christian Pietsch 2016 년

11

당신이 필요한 전부입니다 reptyr. 그것은에 살고 GitHub의 너무 다른 GNU / 리눅스 배포판에 대한 아마와 위지 때문에 데비안 패키지되었으며,. 프로세스 ID (PID)로 호출하면 현재 터미널에서 사용하지 않는 프로세스를 포 그라운드로 표시합니다. 예를 들어 :

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here

2
(sudo apt-get install reptyr) 그런 다음 첫 번째 시도에서 이것을 얻었습니다. "커널을 연결하는 동안 커널이 권한을 거부했습니다. uid가 대상의 값과 일치하면 / proc / sys / kernel / yama / ptrace_scope의 값을 확인하십시오. 자세한 내용은 다음을 참조하십시오. /etc/sysctl.d/10-ptrace.conf "두 위치의 값을 1에서 0으로 변경했는데 제대로 작동했습니다. 동일한 사용자 (ubuntu 14.04 LTS의 ipython 노트북)로 프로세스의 부인과 파충류를 테스트했습니다. 아마도 이것은 고립 된 환경에서의 개발에는 괜찮을 것입니다. 그러나 궁극적 인 보안 변화가 확실하지 않습니다. 어쩌면 전문 지식을 가진 사람이
들어올

1

죄송합니다 원칙적으로 제거하면 일부 쉘 내부 상태 만 변경되기 때문에 가능합니다. 기본적으로 프로세스 ID를 목록에서 제거하고 너무 번거 로움없이 다시 넣을 수 있습니다 (테스트시 약간의주의가 필요합니다) 다시 첨부 된 pid는 올바른 세션에 있지만 극복 할 수는 없습니다). 그러나 일반적인 쉘 (bash, ksh, tcsh, zsh) 중 어느 것도 다시 추가하는 방법이없는 것 같습니다. (zsh를 사용하면 jobstates, jobdirsjobtext연관 배열에 쓸 수 있습니다 . 어떻게 그렇게 할 수 있는지는 모르겠습니다.)

쉘이 소유 한 서브 프로세스에서와 같이 처리되지 않은 프로세스로 신호를 보내려면, 신호를 수신 할 때까지 대기하고 동일한 신호를 소유하지 않은 프로세스로 전송하는 스텁 작업을 작성할 수 있습니다. 당신은 보낼 수 SIGSTOPSIGCONT부인 프로세스 시뮬레이션 Ctrl+ Zbg. 이 중 어느 것도 재 소유만큼 편리하지는 않습니다.


0

어떤 상황입니까? 터미널을 잠시 동안 다시 가져 오려면 GNU Screen을 대신 사용할 수 있습니다 . 터미널에서 프로세스를 완전히 분리 하지는 않습니다. 화면은 프로세스의 이점을 위해 하나를 에뮬레이트하지만 사용중인 실제 터미널에서 프로세스를 연결하거나 분리 할 수 ​​있습니다. 화면을 분리하고 로그 아웃 한 다음 다시 로그인하여 동일한 화면에 다시 연결할 수도 있습니다.


6
상황은 다음과 같습니다. 잘못된 프로세스를 제거하고 다시 가져 오려고합니다.
nisc

1
아 더 힘들어요 화면을 미리 계획해야합니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.