我想在屏幕会话中启动一些应用程序,但从脚本。
没有脚本,我会启动屏幕,然后用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回答后编辑 :
一半的工作解决scheme是
screen -d -m -S test tail -f /var/log/messages screen -S test -X screen tail -f /var/log/xinetd.log
链接屏幕命令(-X后的命令)正在工作,而exec可能不是因为exec期望当前窗口被定义,而当屏幕被分离时没有当前窗口。 感谢AlexD提供的这个技巧。
但有一个奇怪的副作用:当程序停止时(如果你连接屏幕会话和crtl-c尾巴,或杀死尾巴)屏幕窗口将closures。
所以行为与Crtl-A c不一样,并运行命令
另一个副作用是你不能连锁2个命令
screen -S test -X screen command命令是你需要添加窗口到守护进程会话,但不是你给的原因。 它的工作原理是-X采用屏幕命令而不是shell命令,屏幕命令创build一个窗口被称为混淆屏幕。 没有执行屏幕命令。 除非使用shell脚本构build命令(如下所示: screen -S script -X screen sh -c 'command1; command2;' ),否则不会链接。
调用screen -S test -X screen没有命令是没有用的,因为默认的命令是一个shell,一旦你产生了一个shell,你就没有一个非交互(而且是非迂回)的方法来在shell中运行命令。 没有交互式shell,最好自行运行命令。 一个副作用是,当命令退出时,屏幕窗口不再有一个孩子,并将closures。
现在,在命令退出之后,仍然可以让屏幕保持窗口打开。 使用zombie屏幕命令来启用它。 你的序列看起来像:
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
如果你想和Ctrl-A c一样的效果,那么你应该使用screen而不是exec :
屏幕-Stesting-X屏幕尾部-f / var / log /消息 屏幕-Stesting-X屏幕 screen -S test -X screen tail -f /var/log/xinetd.log
另外,您可以将上面的命令移动到$HOME/.screenrc-younameit文件(不带screen -S test -X前缀)并启动screen -c $HOME/.screenrc-younameit当您要创build特定的屏幕会话时。
正在使用byobu一个选项?
我今天晚上做了同样的事情,我想打开几个预先打开的文件的屏幕。 我花了一段时间才弄明白了这一切,但是我终于想出下面这个似乎很好用的工作:
#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
这将创build六个不同的屏幕,屏幕1-5已打开各种文件。 我不知道所有的细节,但“东西”基本上告诉屏幕下面引用的文本不是一个屏幕命令。 然后,“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'的屏幕会话的第一个窗口。
希望有所帮助!