rc.local에서 시작된 Screen 세션은 루트 아래의 screen -ls에 표시되지 않습니다.

rc.local에서 시작된 Screen 세션은 루트 아래의 screen -ls에 표시되지 않습니다.

CentOS 7에서.

/etc/rc.d/rc.local을 편집하여 실행 가능하게 만들고 여기에서 스크린 세션을 시작합니다.

문제는 루트로 서버에 로그인할 때 rc.local에서 시작되어 screen -ls루트로 실행되는 screen 세션이 표시되지 않는다는 것입니다.

이렇게 하면 ps axuf | grep -i screen화면 세션이 활성화되어 있고 화면 내에서 프로세스가 실행되는 것을 볼 수 있습니다.

이 스크린 세션에 어떻게 참여하나요?

내 rc.local 화면 섹션은 다음과 같습니다.

/usr/bin/screen -wipe
/usr/bin/screen -dmS scr1 /script/rsync1.sh
/usr/bin/screen -dmS scr2 /script/rsync2.sh
/usr/bin/screen -dmS scr3 /script/rsync3.sh
/usr/bin/screen -dmS scr4 /script/rsync4.sh
/usr/bin/screen -dmS scr5 /script/rsync5.sh

ps auxf서버가 시작된 후 스크린 세션이 시작되는 것을 볼 수 있습니다.

root@server [~]# ps auxf | grep -i screen
root       90642  0.0  0.0 112648   988 pts/0    S+   21:54   0:00          \_ grep --color=auto -i screen
root        3384  0.0  0.0 127784  2212 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr1 /script/rsync1.sh
root        3390  0.0  0.0 127784  2252 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr2 /script/rsync2.sh    
root        3393  0.0  0.0 127784  2252 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr3 /script/rsync3.sh
root        3398  0.0  0.0 127784  2252 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr4 /script/rsync4.sh
root        3403  0.0  0.0 127784  2248 ?        Ss   21:33   0:01 /usr/bin/SCREEN -dmS scr5 /script/rsync5.sh

이 작업을 시도하면 screen -r scr1해당 화면이 실행되지 않는 것을 볼 수 있습니다.

세션이 루트로 실행 중이므로 왜 볼 수 없는지 모르겠습니다.

명령 시작 부분에 /usr/bin/sudo를 추가하려고 시도했지만 완전히 부팅되지 않았습니다.

Jul 10 22:07:37 server systemd[1]: Starting /etc/rc.d/rc.local Compatibility...
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server systemd[1]: rc-local.service: control process exited, code=exited status=1
Jul 10 22:07:39 server systemd[1]: Failed to start /etc/rc.d/rc.local Compatibility.
Jul 10 22:07:39 server systemd[1]: Unit rc-local.service entered failed state.
Jul 10 22:07:39 server systemd[1]: rc-local.service failed.

또한 screen -wiperc.local 외부에서 수동으로 시작된 세션은 처음에는 영향을 받지 않는 것으로 보입니다.

서버가 충돌하는 경우 수동으로 시작한 화면은 여전히 screen -ls​​루트에서 정지된 것처럼 보입니다.

@reboot를 사용하여 crontab에 추가하는 대신 이것을 rc.local에 추가했습니다. 왜냐하면 시스템이 충돌하거나 재부팅하지 않고 전원이 꺼지면 작동하지 않기 때문입니다. @reboot는 재부팅 시 cron에서만 트리거된다는 것을 이해하고 있기 때문입니다.

$SCREENDIR에 대한 Stephen Harris의 의견으로 해결되었습니다.

시작 스크립트에서 screen -ls > /tmp/xyzzy.$$(또는 유사한 파일 이름)를 수행하면 소켓이 저장되는 디렉터리를 알려줍니다. 다시 연결하려고 할 때 세션을 보려면 이 디렉터리를 가리키도록 $SCREENDIR을 설정해야 할 수도 있습니다. – 스티븐 해리스 10시간 전

/var/run/screen/S-rootrc.local은 SCREENDIR 로 사용됩니다.

루트는 SCREENDIR로 사용되므로 /root/screensrc.local의 세션이 표시되지 않습니다.

노트:

SCREENDIR로 사용할 폴더를 찾기 위해 rc.local에 screen -ls > /tmp/xyzzy.$$를 추가할 필요가 없습니다. 이렇게 하면 볼 수 있듯이 systemctl status rc-local출력에 다음과 같은 내용이 표시됩니다.

rc.local[3258]: No Sockets found in /var/run/screen/S-root.

완료 후 export SCREENDIR=/var/run/screen/S-root screen -ls표시 화면은 rc.local에서 시작됩니다.

답변1

$SCREENDIR에 대한 Stephen Harris의 의견으로 해결되었습니다.

시작 스크립트에서 screen -ls > /tmp/xyzzy.$$(또는 유사한 파일 이름)를 수행하면 소켓이 저장되는 디렉터리를 알려줍니다. 다시 연결하려고 할 때 세션을 보려면 이 디렉터리를 가리키도록 $SCREENDIR을 설정해야 할 수도 있습니다. – 스티븐 해리스 10시간 전

/var/run/screen/S-rootrc.local은 SCREENDIR 로 사용됩니다.

루트는 SCREENDIR로 사용되므로 /root/screensrc.local의 세션이 표시되지 않습니다.

노트:

SCREENDIR로 사용할 폴더를 찾기 위해 rc.local에 screen -ls > /tmp/xyzzy.$$를 추가할 필요가 없습니다. 이렇게 하면 볼 수 있듯이 systemctl status rc-local출력에 다음과 같은 내용이 표시됩니다.

rc.local[3258]: No Sockets found in /var/run/screen/S-root.

완료 후 export SCREENDIR=/var/run/screen/S-root screen -ls표시 화면은 rc.local에서 시작됩니다.

관련 정보