화면 내에서 화면 프로세스 교체

화면 내에서 화면 프로세스 교체

exec screen스크린 세션에서 이미 실행되고 있지 않은 경우 쉘이 시작되도록 구성했습니다 . 따라서 TTY에서 프로세스 트리는 다음과 같습니다.

login───screen───screen───zsh.

거의 모든 경우에 이것이 내가 원하는 것이지만 때로는 화면 없이 무언가를 실행하고 싶고 평소 설정을 변경하지 않고 그렇게 하고 싶습니다. 최상위 화면 프로세스를 다음과 같은 다른 것(예: 셸)으로 바꾸는 명령을 찾고 있습니다.

login───bash,

다시 로그아웃하고 my 또는 use를 .zshrc임시로 변경할 필요가 없습니다 chsh.

답변1

없이 스크린 세션을 시작해야 합니다 .zshrc. 현재 프로세스를 새 프로세스로 교체합니다. 따라서 더 이상 존재하지 않기 때문에 원래 프로세스로 돌아갈 수 없습니다.execscreenexec

로 시작할 수 없는 경우 exec다음 pstree과 유사하게 보일 것입니다( -p이해를 위해 PID를 표시하기 위해 pstree에 추가했습니다).

|-login(857)---zsh(31597)---screen(1105)---screen(1108)---zsh(1109)-+-pstree(1209)
$ echo $$
1109

우리는 이제 하위 프로세스에 있으므로 screen이제 screen닫기 screen이외의 작업을 수행하거나 screen-를 사용하여 분리하려는 경우 . 다시:ctrla dpstree

|-screen(1108)---zsh(1109)
|-login(857)---zsh(31597)-+-pstree(1481)
$ echo $$
31597

첫 번째 줄은 screen내부에서 실행되는 셸에서 분리되고, 두 번째 줄은 현재 실행 중인 셸(현재 위치)입니다. 보시다시피 이 $$변수에는 첫 번째 프로세스의 PID가 포함되어 있습니다 zsh.

화면으로 돌아가려면 다음을 호출하세요.

screen -r

이제 첫 번째 시나리오와 유사해 보입니다.

|-screen(1108)---zsh(1109)-+-pstree(2118)
|-login(857)---zsh(31597)---screen(2112)
$ echo $$
1109

PID를 확인하세요. (1108) 의 하위 쉘로 돌아왔습니다 screen. 이 screen프로세스(1108)는 더 이상 존재하지 않기 때문에 원래 화면(1105)의 하위 항목이 아닙니다. 이것이 1108의 부모가 다시 지정된 이유입니다(그의 부모는 이제 init1의 PID를 갖습니다). reconnect를 호출하면 screen -r새 PID(2112)를 사용하여 새 화면 프로세스가 생성됩니다. 이러한 screen프로세스는 간단한 Unix 소켓이나 명명된 파이프를 통해 서로 통신합니다.

답변2

제 제안은 셸을 화면으로 교체하지 말고 화면 실행 여부에 따라 부팅하거나 연결하면 자유롭게 사용할 수 있다는 것입니다 ctrl+ a-d

if [[ ! $(screen -ls 2>&1) =~ .*No.Sockets.* ]] ; then 
  screen -U -x 
else 
  echo 'No existing screen sockets found, launching screen!'; screen -U -S session -s `which zsh`
fi

~/.bash_profile 또는 ~/.bashrc에 ↑를 붙여넣고 사용자의 기본 셸을 bash로 설정해야 합니다. 그러면 새 화면 창을 만들 때마다 새 zsh 프로세스가 포크되고 항상 화면 세션에 다시 연결되거나 실행 중이 아닌 경우 새 화면 세션이 시작됩니다. 이렇게 하면 화면에서 벗어나 화면 밖에서 작업을 실행할 수 있습니다. 예를 들어, 이미 화면에 있는 프로세스 중 하나를 이동하려면 다음과 같이 하면 됩니다.렙텔.

답변3

아래 방법은 다소 까다로울 수 있지만 문제를 해결할 수 있습니다.

/etc/passwd 파일을 편집하고 사용자 행을 복사하여 사용자 복사본을 만들 수 있습니다. 사용자 이름(첫 번째 필드)만 변경하세요. "새" 사용자에 대한 비밀번호를 설정합니다 passwd newuser. 마지막으로 귀하의 이름을 변경 하고 사용자 이름 확인으로 .zshrc바꾸십시오 .exec screen

if [ "`id -un`" != "newuser" ]
then
    exec screen
fi

사용자 없이 세션을 갖고 싶은 경우에는 exec screen일반 사용자와 동일한 대체 사용자로 로그인할 수 있습니다.

달성하려는 목표에 대해 더 나은 옵션이 있을 수 있지만 이것이 도움이 될 수 있습니다.

관련 정보