从脚本运行(GNU)屏幕

从脚本运行(GNU)屏幕

我想在屏幕会话内启动一些应用程序,但要通过脚本启动。
如果没有脚本,我只需启动屏幕,然后使用 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 startupscreen -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

将 screen 命令(-X 之后的命令)与命令链接起来可以工作,而 exec 则不行,这可能是因为 exec 期望定义当前窗口,而 screen 分离时没有当前窗口。感谢亚历克斯关于此提示。

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

答案1

screen -S test -X screen command命令是向守护进程会话添加窗口所需的命令,但原因并非如此。它之所以有效,是因为 -X 接受的是 screen 命令而不是 shell 命令,而创建窗口的 screen 命令令人困惑地被称为 screen。没有 exec screen 命令。也没有链式操作,除非您使用 shell 脚本构建命令(如下所示:)screen -S script -X screen sh -c 'command1; command2;'

不使用命令进行调用screen -S test -X screen是没有意义的,因为默认命令是 shell,一旦生成 shell,您就没有非交互(且非曲折)的方式在该 shell 内运行命令。最好单独运行命令,而不使用交互 shell。副作用是,当命令退出时,屏幕窗口不再有子窗口,并将关闭。

现在,您可以要求 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 脚本。

屏幕:

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

脚本:

screen -d -m -S script -c screenrc

答案2

如果您想要相同的效果,那么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

答案3

正在使用屏风一个选项 ?

答案4

我今晚也做了同样的事情,我想打开几个预先打开的文件的屏幕。我花了一段时间才弄清楚这一切,但我最终想出了下面的方法,似乎效果很好:


#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 打开了各种文件。我不知道所有的细节,但“stuff”本质上告诉屏幕以下引用的文本不是屏幕命令。然后“eval”对引号中包含的所有内容进行求值。如果没有这个,它只会将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告诉 shell 将“CMD”发送到名为“CS140”的屏幕会话的第一个窗口。

希望有帮助!

相关内容