Gnu-Screen

從腳本執行 (GNU) 螢幕

  • February 18, 2013

我想在螢幕會話中啟動一些應用程序,但從腳本啟動。

如果沒有腳本,我只會啟動螢幕,然後使用 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

使用命令連結螢幕命令(-X 之後的命令)正在工作,而 exec 可能不是因為 exec 期望定義目前視窗,而當螢幕分離時沒有目前視窗。感謝AlexD的提示。

但是有一個奇怪的副作用:當程序停止時(如果你附加螢幕會話和 crtl-c 尾部,或者殺死尾部)螢幕視窗將關閉。

所以行為與 Crtl-A c 不同並執行命令

另一個副作用是你不能連結 2 個命令

screen -S test -X screen command命令是將視窗添加到守護程序會話所需的命令,但不是出於您給出的原因。它之所以有效,是因為 -X 接受一個螢幕命令而不是一個 shell 命令,並且創建視窗的螢幕命令被稱為螢幕,令人困惑。沒有執行螢幕命令。也沒有連結,除非你使用 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

引用自:https://serverfault.com/questions/155851