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 -wipe
rc.local 외부에서 수동으로 시작된 세션은 처음에는 영향을 받지 않는 것으로 보입니다.
서버가 충돌하는 경우 수동으로 시작한 화면은 여전히 screen -ls
루트에서 정지된 것처럼 보입니다.
@reboot를 사용하여 crontab에 추가하는 대신 이것을 rc.local에 추가했습니다. 왜냐하면 시스템이 충돌하거나 재부팅하지 않고 전원이 꺼지면 작동하지 않기 때문입니다. @reboot는 재부팅 시 cron에서만 트리거된다는 것을 이해하고 있기 때문입니다.
$SCREENDIR에 대한 Stephen Harris의 의견으로 해결되었습니다.
시작 스크립트에서 screen -ls > /tmp/xyzzy.$$(또는 유사한 파일 이름)를 수행하면 소켓이 저장되는 디렉터리를 알려줍니다. 다시 연결하려고 할 때 세션을 보려면 이 디렉터리를 가리키도록 $SCREENDIR을 설정해야 할 수도 있습니다. – 스티븐 해리스 10시간 전
/var/run/screen/S-root
rc.local은 SCREENDIR 로 사용됩니다.
루트는 SCREENDIR로 사용되므로 /root/screens
rc.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-root
rc.local은 SCREENDIR 로 사용됩니다.
루트는 SCREENDIR로 사용되므로 /root/screens
rc.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에서 시작됩니다.