创建屏幕并运行命令而不附加

cof*_*der 32 linux gnu-screen

我正在致力于自动化维护例程,该维护例程涉及启动和停止在屏幕会话中运行的脚本。我的方法是终止屏幕会话,然后重新启动它并从脚本中运行命令,使用创建屏幕和传递命令而不需要附加到屏幕的能力。

但是,我在这方面遇到了困难。我可以正确创建屏幕而无需使用screen -d -m -S screen_name. 但是,如果我运行基于以下命令的命令:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

echo -ne '\015' 用反引号而不是单引号包裹。这是模拟用户按下回车键,因为我使用的命令正在移动到一个目录并执行位于那里的脚本。此命令有效,但前提是屏幕创建后已附加到屏幕。当我尝试自动化创建屏幕并在其中运行命令的过程时,我希望避免在脚本中附加和分离。我将尝试创建一个包含我需要在屏幕内执行并根据我的结果进行编辑的命令的 shell 脚本的建议。

有没有办法在一个命令中创建一个屏幕并在屏幕内运行一个命令,或者在创建之后但在执行命令之前不必附加到屏幕?

提前致谢。

**更新 - 尝试了将我需要执行的命令放在 shell 脚本中的建议后,我已经能够成功创建一个屏幕并从屏幕内执行命令,但是我得到了脚本停止运行时的行为屏幕也关闭。这不应该是一个问题,因为脚本是一个日志脚本,它应该只在系统管理员的知识或我试图开发的脚本中停止,但是最好以这样的方式设置屏幕如果脚本停止,则不会消失。是否有可能实现这种行为?**

Mic*_*aff 21

我想你可能会遇到几个问题。

如果命令在您重新连接之前完成,屏幕将消失。您可以使用以下方法进行演示:

screen -d -m ls -l
Run Code Online (Sandbox Code Playgroud)

它将运行ls -l命令,但screen -list不会在屏幕进程结束时显示它。

我也不知道你想用这个 \015 的东西做什么。也许更新您的问题会有所帮助,因为我认为您要做的是在屏幕会话中运行多个命令。这应该很简单:

screen -d -m bash -c "command1 ; command2 ; command3"
Run Code Online (Sandbox Code Playgroud)

如果这些被大量使用,也许你应该制作一个只运行这些命令的 shell 脚本,然后使用更简单的:

screen -d -m /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)


小智 18

启动一个分离的屏幕

screen -dmS <screen name>
Run Code Online (Sandbox Code Playgroud)

在先前创建的分离屏幕中执行命令

screen -S <screen name> -X stuff '<CMD>\n'
Run Code Online (Sandbox Code Playgroud)

是的,您需要输入回车符号来提交命令,否则它只会将字符串添加到屏幕上。

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html

  • `stuff` 实际上是一个将另一个命令复制粘贴到屏幕会话中的命令: stuff [string] 将字符串 string 填充到当前窗口的输入缓冲区中。这类似于“粘贴”命令,但开销要少得多。如果没有参数,屏幕将提示输入字符串。您不能使用“stuff”命令粘贴大缓冲区。它对于键绑定最有用。另请参见“绑定密钥”。[引自 https://theterminallife.com/sending-commands-into-a-screen-session/] (2认同)