从脚本运行(GNU)屏幕


11

我想在屏幕会话中启动一些应用程序,但是要从脚本启动。
如果没有脚本,我将启动屏幕,然后使用crtl-ac打开N个窗口并在每个窗口中执行程序。

我尝试了以下

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

但是,当我附加会话尾巴没有运行。如果我紧接会话screen -d -m -S startup并在screen -S startup -X exec tail -f /var/log/messages另一个终端上运行,它将起作用。

我错过了什么 ?

在AlexD回答后进行编辑

半有效的解决方案是

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

在exec时,将屏幕命令(-X后面的命令)链接到该命令是可行的,这不太可能是因为exec希望定义一个当前窗口,而在屏幕分离时没有当前窗口。感谢AlexD提供了这些技巧。

但是有一个怪异的副作用:当程序停止时(如果您附加了屏幕会话,然后crtl-c拖尾或杀死尾巴),屏幕窗口将关闭。
因此,其行为与Crtl-A c不同,并运行命令。
另一个副作用是,您无法链接2条命令


screen 总是终止时,与该命令发起端-它是工具的正常功能:) ..所以,如果你运行screen top,当您退出topscreen将退出,太
沃伦

是的,我现在就这样,这就是为什么我尝试以守护进程身份启动屏幕,然后使用exec然后使用screen命令打开一个新窗口(启动外壳)的原因。我还尝试了在exec和tail之间或在屏幕之间使用tu prepend bash并告诉它们都没有工作
半径

Answers:


14

screen -S test -X screen command命令是将窗口添加到守护程序会话所需的命令,但并非出于您给出的原因。之所以起作用,是因为-X需要一个screen命令而不是一个shell命令,并且用于创建窗口的screen命令被称为screen。没有执行屏幕命令。除非您使用Shell脚本构建命令(例如:),否则也没有链接screen -S script -X screen sh -c 'command1; command2;'

screen -S test -X screen不使用任何命令进行调用是没有用的,因为默认命令是外壳程序,并且在生成外壳程序后,便没有非交互(且不弯曲)的方式在该外壳程序中运行命令。最好是在没有交互式外壳的情况下独自运行命令。副作用是当命令退出时,屏幕窗口不再有子窗口,它将关闭。

现在,您可以要求屏幕退出命令后使屏幕保持打开状态。使用zombiescreen命令启用它。您的序列如下所示:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

要以交互方式重新连接:

screen -S script -r

最后,您可以将这些-X命令重写为screenrc脚本。

Screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

脚本:

screen -d -m -S script -c screenrc

是的,我知道-X正在执行屏幕命令,这就是我说“束缚屏幕命令(-X之后的命令)”的意思(好吧,现在还不清楚),但是有一个屏幕执行命令,请看一下页,但是正如您所说,在非交互模式下无法按需运行它。无论如何,使用AlexD解决方案,您可以通过zombie命令添加我想要的东西!谢谢
半径

@Tobu:+200提及僵尸!我最终根本不会在那本可怕的手册中注意到它!
葡萄树

6

如果您想要与之相同的效果,Ctrl-A c则应使用screen代替exec

屏幕-S测试-X屏幕尾部-f / var / log / messages
屏幕-S测试-X屏幕
屏幕-S测试-X屏幕尾-f /var/log/xinetd.log

另外,您可以将上面的命令移至$HOME/.screenrc-younameit文件(不带screen -S test -X前缀)并screen -c $HOME/.screenrc-younameit在要创建特定的屏幕会话时启动。


Ctrl-A c在我的第三行中,我想exec无法正常工作,因为exec在当前窗口中运行该命令,而当屏幕分离时,该窗口可能未定义。您的解决方法链接屏幕和命令很好,我应该尝试过!我将为自己添加一个答案,因为您的答案缺少会话创建功能并且没有用到的行(第二行,跳过1个窗口)
半径

实际上,它没有按预期运行,一旦程序停止,窗口就会关闭。如果您执行screen -S test -X screen ls,则窗口将关闭,并且您将永远看不到结果
半径

1

使用byobu是一种选择吗?


我只是尝试过,我看不出有什么用,但是如果您有byobu的有效解决方案,那就可以了,我宁愿只使用屏幕解决方案,但使用附加解决方案比没有解决方案要好!
半径

1

今晚我在做同样的事情,我想打开屏幕并预打开几个文件。我花了一些时间才弄清楚所有这些,但是我终于想到了以下似乎很不错的方法:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

这将创建六个不同的屏幕,其中屏幕1-5已打开各种文件。我不知道所有的细节,但是“东西”从本质上告诉屏幕以下引号不是屏幕命令。然后,“评估”赞扬引号中包含的所有内容。没有此功能, screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" 只需将引用的文本传递给管道,而不执行它。Eval将读取'\ 015'作为换行符,从而执行前面的文本。

在其他细节方面,screen -p 1 -S CS140 -X CMD 告诉外壳程序将“ CMD”发送到名为“ CS140”的屏幕会话的第一个窗口。

希望有帮助!

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.