題 如何自動在同一個屏幕會話中啟動新窗口?


我讀 如何自動啟動多個屏幕會話?,但我不明白第一個接受的答复:

screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"

在我的情況下,我需要為一個腳本自動創建一個屏幕會話,然後我需要在同一個會話中為另一個腳本創建一個新窗口。我會手動:

  1. 運行屏幕
  2. 輸入命令
  3. CTRL+一個
  4. CTRL+C
  5. 輸入命令
  6. CTRL+一個
  7. CTRL+d

如何在腳本中自動執行此操作?一個簡單的例子對我有很大幫助。

謝謝你的回复。


4
2017-10-30 13:53


起源


我不明白你在同一個屏幕會話中的窗口是什麼意思。你想打開兩個窗口查看同一個進程的輸出嗎?你用的是什麼? - wingedsubmariner


答案:


我不確定你想要發生什麼 - 你想要一個腳本用兩個命令創建兩個窗口的屏幕會話,或者你想在運行一個命令的屏幕窗口中運行一個腳本,然後創建一個新的第二個窗口?

第二個很容易,所以讓我們開始吧:

#!/bin/bash
command1
screen command2

在屏幕中運行“屏幕”將在當前會話中創建一個新窗口,而不是啟動一個新窗口。但它會立即返回,所以在最後一行之後,腳本將在command2仍在運行時退出。當command2完成後,它的窗口將關閉。

無論如何,你的問題的第一個解釋有點困難,所以讓我們繼續解決上面的問題:

#!/bin/bash

# Need to positively identify the session name:
SESSION=mysession.$$
echo "TO ATTACH TO SESSION: screen -r ${SESSION}"

# For signalling and stuff
FLAGDIR=$(mktemp -d)

# To keep the windows around after the commands are done,
# set the "zombie" option (see the man-page)
echo "source $HOME/.screenrc" > ${FLAGDIR}/screenrc
echo "zombie xy" >> ${FLAGDIR}/screenrc

# Use that temporary screenrc; create a detached session:
screen \
    -c ${FLAGDIR}/screenrc \
    -d -m \
    -S ${SESSION} \
    bash -c "command1 ; touch ${FLAGDIR}/done"

# Wait for command1 to terminate
while [[ ! -f ${FLAGDIR}/done ]] ; do sleep 1 ; done

# Now start command2 in a new window, by sending a remote command:
screen -S $SESSION -X screen command2

# Don't need this any more:
rm -rf ${FLAGDIR}

該腳本將啟動 command1等到它完成,然後啟動 command2並退出。好像你跑了 command1 ; command2 &,但其他地方的輸出。我相信你可以弄明白怎麼跑 command1 在後台。


0
2017-10-30 16:11



謝謝,我需要運行兩個永久運行的腳本。它將彼此獨立......並且兩者都必須在後台運行......我需要在Debian啟動後運行這些腳本。我希望現在很清楚。 - Mato
@Mato,請嘗試理解腳本 - 您需要做的就是刪除“touch”命令和等待文件出現的while循環。您可以將“zombie xy”更改為“zombie xy onerror”,這樣如果命令以錯誤或信號終止,窗口將只會保持不變,如果您不關心它,您可以跳過整個screenrc內容命令退出或被殺死後。 - Gabe
如果你也可以問你...我怎麼能用inid.d腳本糾正呢?或者我如何才能正確終止或重啟init.d腳本? - Mato
您需要將“quit”命令發送到屏幕會話。在某處保存$ SESSION變量,並使用“screen -S $ SESSION -X quit”終止整個事件。查看“man screen”了解更多信息。 - Gabe
好的,謝謝,是否可能無法正確取消一個窗口 - 通過init.d腳本在同一屏幕中的一個腳本? - Mato


screen -dm  在後台運行您指定的命令創建會話。

所以,如果你把

screen -dm vi xxx
screen -dm vi yyy

在您的腳本中,您將有2個會話,一個編輯xxx並編輯yyy。

screen -ls 將列出您可以附加到使用的會話 screen -r <session number>

由於需要查找會話號,這不是很方便。那是在哪裡 -S 進來。

screen -dmS session1 vi xxx 

將創建一個名為session1的分離會話,以便將腳本更改為

screen -dmS session1 vi xxx
screen -dmS session2 vi yyy

您可以選擇要附加到的會話 screen -r session1 要么 screen -r session2


2
2017-10-30 15:53





  1. 開始會話 startup 並在分離的窗口中運行 command1
  2. 添加新的分離窗口並運行 command2

    screen -dmS startup bash -c 'command1; exec bash'
    screen -S startup -x -X screen bash -c 'command2; exec bash'
    

重新連接會話startup 隨時

screen -r startup

1
2018-06-26 22:28