我想启动 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-c
screen -dmS scr bash -c 'ytop; exec init'
因此,这将具有正常环境,就像您手动启动屏幕>并将其分离一样。