從腳本執行 (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 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
使用命令連結螢幕命令(-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 保持視窗打開。使用
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