无法在屏幕上运行代码

无法在屏幕上运行代码

我有以下代码在美德屏幕上执行一些命令:

screen -R << EOF
    cd /home/users/devops_tester/apps/Selenium-Webdriver
    export DISPLAY=:99
    npm start
EOF

它给了我一个错误:

Must be connected to a terminal.

我该如何解决?

我找到了这个相关主题,但我没有使用 ssh:

如何从桌面通过 ssh 在远程服务器上使用命令启动屏幕会话?

这是屏幕应用程序:

https://packages.ubuntu.com/trusty/screen

答案1

首先-R意味着您正在尝试恢复可能已经运行某些内容的现有屏幕会话。在这种情况下,您不能只是将 shell 命令推入其中并希望它们能够被执行。如果恢复的屏幕会话有一个正在运行的编辑器会怎样?所以,不要使用-R当您想要指定要运行的命令时。

另一个问题是,一旦您通过<< __EOF__被调用的程序使用输入重定向,运行时就不会出现终端,即没有交互式终端。这可以在这里轻松证明:

$ tty
/dev/pts/0

$ tty << __EOF__
__EOF__
not a tty

幸运的是,您screen支持在启动时运行自定义命令。这很简单screen command args(注意没有-R在后屏幕中)。

在您的情况下,您必须将所有命令作为参数传递给,/bin/sh因为 screen 不会为您运行多个 shell 命令。像这样的东西应该有效:

$ screen /bin/sh -cx "cd /home/users/devops_tester/apps/Selenium-Webdriver; export DISPLAY=:99; npm start"

它将生成一个新的屏幕会话并运行您的命令。这-X使 shell 打印它运行的命令供您参考。它是可选的,您可以将其删除。

您还可以在立即分离的屏幕会话中运行上述内容,并稍后重新附加到它:

$ screen -d -m /bin/sh -cx "cd /home/...; export ...; npm start"
# runs the commands in screen but returns immediately

例如,如果您想在系统启动期间运行命令,这非常有用。

当然,您可以重新附加上述会话以查看那里发生了什么。

$ screen -R    # re-attach to the above screen session

最后但并非最不重要的 - 与其将所有命令作为参数传递给/bin/sh它,不如创建一个小的 3 行 shell 脚本,使其可执行并通过简单的调用来运行它,这可能会更容易:

$ screen /path/to/the-script

答案2

您还可以使用 screen 'stuff' 命令将命令行注入到正在运行的 screen 会话中包含的 shell 中。

NL=$(echo -ne '\015')
screen -S YOURSCREEN -dm
#
# Wait a sec for screen to get going...
sleep 1
screen -S YOURSCREEN -p 0 -x stuff "cd /home/users/devops_tester/apps/Selenium-Webdriver${NL}"
screen -S YOURSCREEN -p 0 -x stuff "export DISPLAY=:99${NL}"
screen -S YOURSCREEN -p 0 -x stuff "npm start${NL}"

我使用这种技术在 systemd 或 init.d 中从启动时启动长时间运行的交互式进程

答案3

下面的示例在执行脚本时运行代码,或者在屏幕会话中运行相同的代码./my_script.sh -s

# contents of my_script.sh:

if [ "$1" == "-s" ]; then
    screen "$0"
else
    # code
fi

相关内容