[unix] 화면을 먼저 실행하지 않고 자식을 죽이지 않고 어떻게 터미널을 닫을 수 있습니까?

때로는 그놈 터미널에서 앱을 실행하지만 갑자기 그놈이나 무언가를 다시 시작해야합니다. 질문에 대한 답변도 유용하다고 생각되면 무언가 일어나고있는 SSH에서 연결을 끊고 싶습니다.

그놈의 터미널 트리는 다음과 같습니다 :

gnome-terminal
    bash
        some-boring-process

캔 I ‘분리’ bash에서 gnome-terminal(또는 분리 some-boring-process의 출력 곳 bash가 및 리디렉션)? 난 그냥 죽일 경우 gnome-terminal, bash모든 서브 프로세스를 뜻 살해됩니다



답변

some-boring-process현재 bash 세션에서 실행중인 경우 :

  1. ctrl-z당신에게 bash 프롬프트를 제공하기 위해 그것을 중단
  2. 와 배경에 넣어 bg
  3. 작업 번호를 기록하거나 jobs명령을 사용하십시오.
  4. 이 bash 세션에서 프로세스를 분리하십시오 disown -h %1(실제 작업 번호를 대체하십시오).

그것은 출력을 리디렉션하기 위해 아무것도하지 않습니다-당신은 지루한 프로세스를 시작할 때 그것을 생각해야합니다. [편집] https://gist.github.com/782263 를 리디렉션하는 방법이있는 것 같습니다

그러나 진지하게 화면을 들여다보십시오. 몇 달 동안 실행 된 원격 서버에 쉘이 있습니다.


답변

이것은 정확히 스크린tmux 가 만들어진 것입니다. screen / tmux 세션 내에서 쉘을 실행하면 마음대로 연결을 끊거나 다시 연결할 수 있습니다. 하나의 gnome-terminal 내에서 여러 개의 셸 세션을 실행할 수도 있습니다.


답변

screen, tmux또는 dtach(아마도와 함께 dvtm)이 모두 훌륭하지만, 그중 하나를 사용하지 않았다고 생각되는 경우 활용할 수 있습니다 nohup.


답변

자식 프로세스를 배경 화하고 계속 진행하는 것이 아니라 자식 프로세스와 계속 상호 작용하려면 프로세스를 현재 tty에서 “스틸 링”하고 프로세스에 다시 첨부하는 개념 증명 인 retty 라는 프로그램 이 있습니다. 현재 하나.

그러나 일부 어셈블리 코드를 다시 연결된 응용 프로그램의 스택에 붙이는 것을 포함하여 몇 가지 끔찍한 일을합니다. 그리고이 코드는 x86_64 용으로 업데이트되지 않았습니다.

아마도 사용자 공간의 프로세스를 파일로 동결하여 나중에 복원 할 수있는 다른 프로그램이있을 수 있습니다 (다른 tty에서 가능할 수도 있습니다). 이것은 cryopid 이며 프로젝트도 중단되었습니다. 개념 증명 단계이며 최신 Linux에서는 코드가 작동하지 않습니다. 아 잘

이것이 완성을 위해 여기에 있어야한다고 생각했습니다. 당신이 끔찍한 부두에 의지하지 않는다면, 이것은 적어도 이론적 인 가능성입니다.


답변

시스템 재부팅이 얼마 남지 않더라도 끝내고 ​​싶은 것을 nohup실행하면 백그라운드에서 사용 하고 실행합니다. 화면 등과 달리 프로세스에 다시 연결할 수 없습니다. 그러나 다른 곳에서 출력을 금지하면에서 찾을 수 있습니다 nohup.out.

screen프로세스를 위해 터미널을 전환하고 싶을 때 사용 합니다. 가정 / 직장에서 프로세스를 시작하고 다른 프로세스로 전환하는 등. 다른 터미널 세션 출력과 마찬가지로 결국 버퍼 상단에서 스크롤됩니다.

편집 : 이미 프로세스를 시작한 경우 프로세스가 닫힐 때 신호가 전송 disown되지 않도록 HUP프로세스를 진행할 수 있습니다.


답변

터미널 세션이 종료되면 프로세스 (PID)가 HUP 신호를받지 않도록 할 수 있습니다. 다음 명령을 사용하십시오.

nohup -p PID


답변

이 스크립트는 자식 프로세스를 부모 프로세스에서 분리하여 init 프로세스에 할당합니다 .

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process