从 rc.local 启动的屏幕会话在 root 下的 screen -ls 中不可见

从 rc.local 启动的屏幕会话在 root 下的 screen -ls 中不可见

在 CentOS 7 上。

我已经编辑了 /etc/rc.d/rc.local 并使其可执行,并且我正在从中启动屏幕会话。

问题是,当我以 root 用户身份登录服务器时,我没有看到从 rc.local 启动的屏幕会话,并screen -ls以 root 用户身份运行。

如果这样做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,我会发现没有这样的屏幕正在运行。

会话以 root 身份运行,所以我不确定为什么我看不到它们。

我尝试将 /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 -lsroot 下显示为死机。

我已将其添加到 rc.local 中,而不是使用 @reboot 添加到 crontab 中,因为如果系统崩溃或在不重新启动的情况下关闭电源,这将不起作用,据我了解 @reboot,它只会在重新启动时触发在 cron 中。

由 Stephen Harris 关于 $SCREENDIR 的评论解决。

在启动脚本中执行 screen -ls > /tmp/xyzzy.$$ (或类似的文件名) - 这会告诉您它存储套接字的目录。您可能需要设置 $SCREENDIR 以指向该目录以便在尝试重新连接时查看会话。 – 斯蒂芬·哈里斯 10 小时前

rc.local 用作/var/run/screen/S-rootSCREENDIR

root 用作/root/screensSCREENDIR,这就是它看不到来自 rc.local 的会话的原因

笔记:

不需要将 screen -ls > /tmp/xyzzy.$$ 添加到 rc.local 来查找哪个文件夹用作 SCREENDIR。通过这样做可以看出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

由 Stephen Harris 关于 $SCREENDIR 的评论解决。

在启动脚本中执行 screen -ls > /tmp/xyzzy.$$ (或类似的文件名) - 这会告诉您它存储套接字的目录。您可能需要设置 $SCREENDIR 以指向该目录以便在尝试重新连接时查看会话。 – 斯蒂芬·哈里斯 10 小时前

rc.local 用作/var/run/screen/S-rootSCREENDIR

root 用作/root/screensSCREENDIR,这就是它看不到来自 rc.local 的会话的原因

笔记:

不需要将 screen -ls > /tmp/xyzzy.$$ 添加到 rc.local 来查找哪个文件夹用作 SCREENDIR。通过这样做可以看出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 开始

相关内容