답변:
리눅스 작업과 프로세스 소유권의 작동 방식을 고려할 때 채택 프로세스의 도움없이 프로세스를 다시 소유 할 수는 없습니다.
부모는 자식을 '파기'하고 'init'라는 프로세스에 의해 '채택'될 수 있습니다. 시스템 보안은 누군가가 다른 사람의 프로세스를 잡지 못하게합니다. 프로세스를 제거하면 프로세스는 제어 할 다른 사람 (초기)이됩니다. '사용자'는 여전히 프로세스를 종료 할 수 있지만 다시 되돌릴 수는 없습니다. init가 메일을 읽지 않기 때문에 프로세스를 반환하도록 init을 강제하려고 시도하는 것은 효과가 없을 것입니다.
말 그대로, "그렇게 하지마!"라는 대답으로 귀결됩니다.
reptyr
하십시오 (사용 예는 내 대답을 참조하십시오).
불행히도 잘못된 프로세스를 제거 한 불행한 상황에 처한 사람에게는 도움이되지 않는다고 생각하지만 워크 플로에서 disown을 제거하고 다음과 같이 바꾸려면 다음과 같이하십시오.
https://github.com/nelhage/reptyr
모든 프로세스를 보호 할 수 있습니다 (예 : 화면 내로 이동).
reptyr
해결책이지만 사용을 중지 할 필요는 없습니다 disown
. 명확하게하기 위해 새로운 답변을 작성했습니다.
당신이 필요한 전부입니다 reptyr
. 그것은에 살고 GitHub의 너무 다른 GNU / 리눅스 배포판에 대한 아마와 위지 때문에 데비안 패키지되었으며,. 프로세스 ID (PID)로 호출하면 현재 터미널에서 사용하지 않는 프로세스를 포 그라운드로 표시합니다. 예를 들어 :
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
죄송합니다 원칙적으로 제거하면 일부 쉘 내부 상태 만 변경되기 때문에 가능합니다. 기본적으로 프로세스 ID를 목록에서 제거하고 너무 번거 로움없이 다시 넣을 수 있습니다 (테스트시 약간의주의가 필요합니다) 다시 첨부 된 pid는 올바른 세션에 있지만 극복 할 수는 없습니다). 그러나 일반적인 쉘 (bash, ksh, tcsh, zsh) 중 어느 것도 다시 추가하는 방법이없는 것 같습니다. (zsh를 사용하면 jobstates
, jobdirs
및 jobtext
연관 배열에 쓸 수 있습니다 . 어떻게 그렇게 할 수 있는지는 모르겠습니다.)
쉘이 소유 한 서브 프로세스에서와 같이 처리되지 않은 프로세스로 신호를 보내려면, 신호를 수신 할 때까지 대기하고 동일한 신호를 소유하지 않은 프로세스로 전송하는 스텁 작업을 작성할 수 있습니다. 당신은 보낼 수 SIGSTOP
및 SIGCONT
부인 프로세스 시뮬레이션 Ctrl+ Z와 bg
. 이 중 어느 것도 재 소유만큼 편리하지는 않습니다.
어떤 상황입니까? 터미널을 잠시 동안 다시 가져 오려면 GNU Screen을 대신 사용할 수 있습니다 . 터미널에서 프로세스를 완전히 분리 하지는 않습니다. 화면은 프로세스의 이점을 위해 하나를 에뮬레이트하지만 사용중인 실제 터미널에서 프로세스를 연결하거나 분리 할 수 있습니다. 화면을 분리하고 로그 아웃 한 다음 다시 로그인하여 동일한 화면에 다시 연결할 수도 있습니다.