如何在启动时启动屏幕并与用户环境分离?

如何在启动时启动屏幕并与用户环境分离?

我想启动 screen 并在启动时运行几个程序。我看过很多类似的帖子,但没有一个回答我的问题。所以我输入了rc.local以下两行:

  screen -dmS scr bash -c 'ytop; exec bash'
  screen -S scr -X screen 1 bash -c 'nvtop; exec bash'

运行正常,但是当我进入此屏幕时,一旦登录到服务器,并想要创建新屏幕,它就没有环境变量。我怎样才能以包含所有 root 环境变量的方式启动它?
新窗口如下所示:

sh-5.1# 

$PATH在窗口中
/usr/bin:/bin

然而在rc.local创建的窗口中$PATH/usr/bin:/bin)是相同的,但是提示是正常的,因此看起来它读取/etc/profile
由 rc.local 初始化的窗口有正常的提示:

[root@mysrv ~]#

PATH 也比新窗口多一点,但与我以 root 身份从终端手动启动屏幕不同

echo $PATH
usr/lib64/qt-3.3/bin:/usr/bin:/bin


当我自己启动屏幕时,它是正常提示。

[root@mysrv ~]#

echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

有趣的是,如果我退出,ytop它会显示正确的提示。只有在创建新屏幕时,才会以某种方式丢失此 envars。
我还尝试运行:

su - root -c `screen -dmS scr bash -c 'ytop; exec bash'`

但我得到了相同的结果。
问候

答案1

我认为您的问题是 bash 的会话处理。Bash - 与任何其他 shell 解释器一样 - 检测它是否在后台启动,或者是否连接到终端(交互/非交互模式)。发现后台这里-l。我的猜测是,通过提供第一个 bash 命令的开关可以解决您的问题:

screen -dmS scr bash --login -c 'ytop; exec bash'

--login开关使 bash 读取所有启动文件,如/etc/profile、、和- 其中应该包含~/.bash_profile您缺少的环境变量。~/.bash_login~/.profile

答案2

我终于找到了解决方案。非常简单。我必须编辑文件/etc/screenrc并添加以下行

defshell -/bin/bash

然后,当以分离模式启动屏幕时(screen -dmS scr bash -c 'ytop; exec bash'),它可以正常工作,并且稍后进入此屏幕并创建新窗口时,将存在 bash 环境。

下面的解决方案也不起作用。

因此要使用普通 shell 和变量启动屏幕,您必须使用 >with 来执行此操作init,因此:

su-root-cscreen -dmS scr bash -c 'ytop; exec init'

因此,这将具有正常环境,就像您手动启动屏幕>并将其分离一样。

相关内容