gpt4 book ai didi

bash - 分离模式下的启动 screen 没有源环境

转载 作者:行者123 更新时间:2023-11-29 09:28:22 28 4
gpt4 key购买 nike

我想以分离状态启动 screen session ,以便它们在脚本完成后终止 and 这样我就可以编写一个脚本来执行多个 screen session ,而无需我手动启动每个 session 然后分离,然后再进入下一个 screen session 。

此脚本取决于设置的某些环境变量。通常,当我在 screen 之外运行此脚本时,在常规 bash shell 中,我只需在我的 .bash_profile 文件中设置这些环境变量.

此外,当我以非分离状态启动 screen 并放入我的 .screenrc 文件时:

shell -$SHELL

那我也没有问题

只有当我执行 screen -dm 然后我的脚本无法运行时才会出现问题,因为我需要的环境没有设置。

当以分离状态启动时,我如何告诉 screen 引用 .screenrc 文件,以便它最终在启动时获取我的 .bash_profile

更新

当我执行 screen -dmL env 时,我可以看到一些但不是所有的环境变量都存在。

最佳答案

我相信你的问题是当在分离模式下启动 screen 时,screen 不会启动登录 shell 或交互式 shell,所以你的 .bash_profile 不是源代码(请参阅 man bash 的“INVOCATION”部分,了解启动时源文件的说明)。请注意,您的

中的前导 -
shell -$SHELL

设置意味着 shell 将始终作为登录 shell 启动,因此将获取 .bash_profile

您的问题的一些可能的解决方案:

  1. 不要在分离状态下启动screen。请注意,如果脚本是作为命令给出的,则 screen 会在脚本以通常方式启动时终止。例如,对于脚本 test.sh:

    #!/bin/bash

    for n in `seq 1 5`; do
    echo $n
    sleep 1
    done

    执行 screen ./test.sh 运行脚本并在 5 秒后终止。

  2. 在 screen 上运行的脚本中手动获取您的.bash_profile。 IE。添加

    source ~/.bash_profile

    到脚本的开头,MyScript

更新1

我仍然怀疑问题是您的 .bash_profile 没有被加载,所以让我们确保您的 .screenrc 正在 被加载。尝试添加

screen touch /tmp/when-was-screen-rc-sourced

到你的~/.screenrc的末尾,然后做

screen MyScript

然后

ls -lt --full-time /tmp

尝试以几种不同的方式启动 screen ,看看 ~/.screenrc 是否真的无法加载。

同样的,可以添加一行

touch /tmp/when-was-bash-profile-sourced

到你的 ~/.bash_profile 的末尾,看看它何时加载。

更新2

这是一个示例,显示 screen 确实在您有行时运行您的脚本

screen touch /tmp/when-was-screen-rc-sourced

在你的 ~/.screenrc 的末尾。

这里是测试文件test.sh:

#!/bin/bash

touch /tmp/when-did-test-sh-start
for n in `seq 1 5`; do
echo $n
sleep 1
done
touch /tmp/when-did-test-sh-finish

这是证据。运行

$ touch /tmp/when-did-we-start; screen -d -m ./test.sh; sleep 6; ls -ltr --full-time /tmp | tail -n4

给出输出

-rw------- 1 collins collins    0 2013-11-06 14:43:03.643564802 -0800 when-did-we-start
-rw------- 1 collins collins 0 2013-11-06 14:43:03.659565385 -0800 when-was-screen-rc-sourced
-rw------- 1 collins collins 0 2013-11-06 14:43:03.671565892 -0800 when-did-test-sh-start
-rw------- 1 collins collins 0 2013-11-06 14:43:08.707770194 -0800 when-did-test-sh-finish

所以,我仍然认为问题与您的 ~/.bash_profile (或任何定义你丢失的环境变量的东西)都没有被加载。

更新 3

此时可能更容易准确理解您的意思尝试完成,然后想出更好的方法来完成它。到这样做对你提供一个最小的例子会有帮助说明您的问题的脚本(即它在您运行时有效直接,或在启动 screen 后手动,但不是直接运行时通过 screen ./example.shscreen -d -m ./example.sh).

但是,与此同时,这里有另一个潜在的解决方法(你有没有曾经尝试过我上面的第二个原始建议,只是采购你的~/.bash_profile 直接在你的脚本中?):

用 bash 运行你的脚本,明确地使 bash 交互和/或登录 shell 。例如。对于交互式登录 shell 做

screen -d -m bash -i -I ./MyScript

here有关 bash 在何种模式下加载哪些文件的一个很好的总结。根据对于 man bashbash -i -I 组合应该让 bash 运行你的交互式登录模式下的脚本,因此 ~/.bash_profile 应该获取来源。

关于bash - 分离模式下的启动 screen 没有源环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19799395/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com