GNU 화면에서 "-dm"과 "-Dm"의 차이점은 무엇입니까?

GNU 화면에서 "-dm"과 "-Dm"의 차이점은 무엇입니까?

GNU 화면 매뉴얼은 다음과 같이 말합니다:

    `-d -m'
          Start `screen' in _detached mode. This creates a new session
          but doesn't attach to it. This is useful for system startup
          scripts.

    `-D -m'
          This also starts `screen' in _detached_ mode, but doesn't fork
          a new process. The command exits if the session terminates.

-dm나는 확신한다:

  • screen제공된 명령(또는 아무것도 지정되지 않은 경우 셸)을 실행하기 위해 새 프로세스를 포크합니다.
  • "포크"는 이상한 슈뢰딩거의 시스템 호출을 의미합니다. 여기서 소스 코드는 반환 값을 관찰할 때까지 반환 값이 부모인지 자식인지 알 수 없습니다.
  • 이 새로운 프로세스는 screen첨부할 수 있는 것으로 간주됩니다.

나는 그것이 -dm쉘의 제어권을 반환하지만 -Dm차단한다는 것을 알았습니다.

그래서 내 질문은 다음과 같습니다

  • 왜 차단되나요 -Dm? 이것이 분기가 없는 것과 어떤 관련이 있습니까?
  • 포크 외에 또 무엇을 할 수 있나요? "분리 모드"는 프로세스가 추가 가능한 PID로 식별될 수 있음을 의미하므로 여전히 새로운 프로세스를 생성한다고 생각합니다.
  • -Dm대신 사용 사례는 무엇입니까 -dm?

감사해요!

답변1

문서 인용문의 맥락에서 screen"새로운 프로세스를 포크하다"로"로새로운 자식 프로세스 시작". 너무 멀리 나아갈 위험이 있지만 프로세스 작동 방식에 대해 생각하는 방법은 다음과 같습니다. 하위 프로세스를 만들려면 프로세스를 fork(2)사용해야exec(2) 합니다. 중학교 부모는 다음을 선택할 수 있습니다.

  1. 하위 프로세스 완료를 호출합니다. 즉, 하위 프로세스가 종료될 때까지 차단한 다음 호출에서 wait(2)종료 상태를 반환합니다.wait(2)
  2. 자식 프로세스가 종료되었음을 알리는 신호를 받을 때까지 계속되며 SIGCHLD, 이때 wait(2)종료 상태를 수신하기 위해 호출됩니다.
  3. 자식 프로세스에 신경 쓰지 않고 종료합니다. 이 경우 프로세스의 부모가 자식 프로세스의 새로운 부모가 됩니다.

이제 이를 염두에 두고 적용 방법은 다음과 같습니다 screen.

screen -dm자신의 명령이 계속 실행될 수 있도록 새(자식) 프로세스를 생성하고 해당 프로세스에서 분리 하고 싶은 경우가 종종 있습니다 . 예를 들어, 이는 명령이 차단되는 것을 원하지 않는 ~/.profile이전 시스템의 맥락에서 의미가 있을 수 있습니다 . /etc/rc.local이 경우 위의 하위 프로세스는 실제로 의 또 다른 부분이며 screen, 이는 다시 다른 하위 프로세스(원래 상위 프로세스의 손자)로서 실제 명령 프로세스를 시작합니다. 두 부분은 통신 screen하고 하위 인스턴스는 screen실제로 원하는 작업을 수행하기 위해 명령 하위 인스턴스를 관리합니다.

screen때로는 감독자의 통제 하에 이를 사용 하고 싶을 수도 있습니다 systemd. 예를 들어 이 경우 screen -Dm감독자가 관리되는 프로세스가 screen종료되는지 여부와 시기를 식별하여 다시 시작하기 위해 사용할 수 있습니다. 자식 프로세스가 분리된 경우 screen(있는 그대로 screen -dm) 감독자는 해당 프로세스가 여전히 실행 중인지 쉽게 알 수 없습니다. 이러한 -Dm플래그를 사용하면 screen자식 프로세스에 모든 기능을 부여하는 동시에 해당 프로세스의 존재를 부모 프로세스에 전달할 수 있습니다. 이 경우 screen중간 프로세스(자식 프로세스)가 생성되지 않으며 screen상위 프로세스는 실제로 원하는 작업을 수행하는 명령 하위 프로세스를 직접 제어합니다.

고려하다

  1. screen -dm sleep 30- 명령을 실행한 대화형 셸에서는 screen명령이 sleep 30아직 실행 중인지 알 수 없습니다. 의견은 안 받아요.
  2. screen -Dm sleep 30- 대화형 쉘은 sleep 30종료될 때까지 차단됩니다. 이 시점에서 더 이상 실행되지 않는다는 것을 알 수 있습니다. 분명히 대화형 세션에는 그다지 유용하지 않지만 systemd.

관련 정보