我想在屏幕会话中启动一些应用程序,但是从脚本中启动。
如果没有脚本,我只会启动屏幕,然后用 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
Run Code Online (Sandbox Code Playgroud)
但是当我附加会话尾部时,它没有运行。如果我紧接着附加会话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
Run Code Online (Sandbox Code Playgroud)
使用该命令链接屏幕命令(-X 之后的那个)在 exec 时正在工作,这可能是因为 exec 期望定义当前窗口,而在分离屏幕时没有当前窗口。感谢AlexD提供的提示。
但是有一个奇怪的副作用:当程序停止时(如果你附加屏幕会话并 crtl-c 尾部,或杀死尾部)屏幕窗口将关闭。
所以行为与Crtl-A c 不一样,运行命令
另一个副作用是你不能链接2个命令
Tob*_*obu 15
该screen -S test -X screen command命令是将窗口添加到守护程序会话所需的命令,但不是出于您给出的原因。它起作用是因为 -X 接受一个 screen 命令而不是一个 shell 命令,并且令人困惑地调用了用于创建窗口的 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
Run Code Online (Sandbox Code Playgroud)
要以交互方式重新附加:
screen -S script -r
Run Code Online (Sandbox Code Playgroud)
最后,您可以将这些 -X 命令重写为 screenrc 脚本。
屏幕截图:
zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log
Run Code Online (Sandbox Code Playgroud)
脚本:
screen -d -m -S script -c screenrc
Run Code Online (Sandbox Code Playgroud)
如果你想要同样的效果,Ctrl-A c你应该使用screen而不是exec:
screen -S test -X screen tail -f /var/log/messages 屏幕 -S 测试 -X 屏幕 screen -S test -X screen tail -f /var/log/xinetd.log
此外,您可以将上面的命令移动到$HOME/.screenrc-younameit文件(不带screen -S test -X前缀)并screen -c $HOME/.screenrc-younameit在您想要创建特定屏幕会话时启动。
| 归档时间: |
|
| 查看次数: |
8393 次 |
| 最近记录: |