我想在屏幕会话内启动一些应用程序,但要通过脚本启动。
如果没有脚本,我只需启动屏幕,然后使用 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
将 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 在命令退出后仍然保持窗口打开。使用zombie
screen 命令启用此功能。您的序列如下所示:
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”的屏幕会话的第一个窗口。
希望有帮助!