我有以下代码在美德屏幕上执行一些命令:
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 在远程服务器上使用命令启动屏幕会话?
这是屏幕应用程序:
答案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