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


28

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

但是,我对此有困难。我可以在不使用的情况下正确创建屏幕screen -d -m -S screen_name。但是,如果我基于以下命令运行命令:

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

回声-ne'\ 015'用反引号而不是单引号引起来。这是模拟用户在我使用的命令移至目录并执行位于该目录的脚本时按下Enter键。该命令有效,但是仅在创建屏幕后将其附加到屏幕上的情况下。当我尝试自动化创建屏幕并在其中运行命令的过程时,我希望避免在脚本内附加和分离。我将尝试创建一个shell脚本的建议,该脚本包含需要在屏幕内执行并根据结果进行编辑的命令。

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

提前致谢。

**更新-尝试过将我需要执行的命令放置在shell脚本中的建议,我已经能够成功创建一个屏幕并从该屏幕内执行命令,但是当脚本停止运行时,我的行为是屏幕也会关闭。这不应该是一个问题,因为该脚本是一个日志记录脚本,仅应在知道sys admin或通过我尝试开发的脚本后停止,但是最好以这样的方式进行屏幕设置:如果脚本停止,则不会消失。是否有可能实现这种行为?**


1
我碰到了同样的问题,发现谁在这个问题绊倒为别人上superuser.com解决superuser.com/questions/342463/...
丹·赫伯特

要使屏幕保持打开状态,您可以使用诸如:screen bash -c'echo“ test”; /斌/庆典”
格温

1
对于您的自动关闭问题,您可以使用.screenrc包含line 的特殊行zombie kr,该行将使打开的窗口保持打开状态,您可以按一下k以关闭winodw,或者r再次在窗口中运行命令。我有这个用于我的默认.screenrc。
Martin C.

Answers:


17

我认为您可能会遇到几个问题。

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

screen -d -m ls -l

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

我也不知道您要如何处理\ 015这东西。也许更新您的问题会有所帮助,因为我认为您要尝试在屏幕会话中运行多个命令。这应该很简单:

screen -d -m bash -c "command1 ; command2 ; command3"

如果经常使用这些命令,也许您应该制作一个仅运行这些命令的shell脚本,然后使用更简单的命令:

screen -d -m /path/to/script.sh

有没有办法在不立即分离屏幕的情况下获得类似的行为?假设我要开始ssh会话,然后立即分离;screen -d -m ssh在进行会话之前,将在密码提示下分离。
璀璨之星

这对我不起作用。用几个长时间运行的程序替换“ commandN”不会导致screen -list。另外,这并没有为OP尝试执行的操作命名屏幕。
塞林2014年

我一直在寻找使用此方法运行python程序的方法。我试图创建一个sh脚本来运行它,但是没有看到列表中的屏幕。相反,我使用了 screen -d -m python EventGenerator.py,效果很好
Dan Ciborowski-MSFT 2015年

1
那可能应该bash -c "commands"代替bash "commands"
marcovtwout

您是对的,必须有-c。
Xdg

8

启动分离的屏幕

screen -dmS <screen name>

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

screen -S <screen name> -X stuff '<CMD>\n'

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

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


1
什么是“东西”?
Nadav B

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

2

我以前遇到过此问题,这是cygwin实现的错误。

我所做的是创建一个仅具有以下命令的“ .screenrc_detaching”

#detach
detach 

然后用

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

然后,您便拥有了屏幕会话,它已经被附加和分离了,您可以向其发送命令。

简单 !:P


2

这为我做了工作,没有-c没有工作

screen -d -m bash -c "command1; command2; command3"


1

测试先前答案的“复制粘贴”方法是:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

预期结果应类似于:

No Sockets found in /var/run/screen/S-yourusernamehere.

(这意味着以前没有创建屏幕会话)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(这是创建屏幕和从屏幕分离的时间。几乎是瞬时的。)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(此输出显示可用的屏幕会话。在最后一个命令上创建。)

sleep 20; cat /tmp/h

(这cat显示了在gnu屏幕中执行的主机名)


这些测试的结果是什么?
Pierre.Vriens

没错,没有例子。我会加。
Enrique S. Filiage

好多了!怜悯!+1
Pierre.Vriens

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.