Gnu-Screen

從 rc.local 開始的螢幕會話在 root 下的 screen -ls 中不可見

  • July 11, 2016

在 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 -ls在 root 下顯示為當機。

我已將其添加到 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 開始顯示屏幕後

由 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 開始顯示屏幕後

引用自:https://unix.stackexchange.com/questions/295058