我正在致力於自動化維護例程,其中涉及啟動和停止在螢幕會話中運行的腳本。我的方法是終止螢幕會話,然後重新啟動它並使用建立螢幕和傳遞命令的功能從腳本內運行命令,而無需附加到螢幕。
但是,我在這方面遇到了困難。我可以正確創建螢幕,而無需使用screen -d -m -S screen_name
.但是,如果我運行基於以下內容的命令:
screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''
echo -ne '\015' 用反引號而不是單引號括起來。它是為了模擬使用者按下 Enter 鍵,因為我使用的命令正在移動到目錄並執行位於該目錄的腳本。此命令有效,但僅當螢幕在建立後已附加到該螢幕時才有效。當我嘗試自動化創建螢幕並運行其中的命令的過程時,我希望避免在腳本中附加和分離。我將嘗試建立 shell 腳本的建議,其中包含我需要在螢幕內執行的命令並根據我的結果進行編輯。
有沒有一種方法可以創建螢幕並在螢幕中透過一個命令運行命令,或者無需在創建後但執行命令之前附加到螢幕?
提前致謝。
**更新 - 在嘗試將我需要執行的命令放在 shell 腳本中的建議後,我已經能夠成功創建屏幕並從屏幕內執行命令,但我得到的行為是當腳本停止運行時屏幕也會關閉。這不應該是一個問題,因為該腳本是一個日誌記錄腳本,只能在系統管理員的知識或透過我正在嘗試開發的腳本的情況下停止,但是最好以這樣的方式進行螢幕設定:如果腳本停止則不會消失。有可能實現這種行為嗎? **
答案1
我認為您可能遇到了幾個問題。
如果命令在您重新連接之前完成,螢幕將會消失。您可以使用以下方法進行示範:
screen -d -m ls -l
它將運行該ls -l
命令,但screen -list
不會顯示它,因為螢幕進程已結束。
我也不知道你想用這個 \015 東西做什麼。也許更新您的問題會有所幫助,因為我認為您想要做的是在螢幕會話中執行多個命令。這應該很簡單:
screen -d -m bash -c "command1 ; command2 ; command3"
如果您經常使用這些命令,也許您應該製作一個僅執行這些命令的 shell 腳本,然後使用更簡單的:
screen -d -m /path/to/script.sh
答案2
啟動分離螢幕
screen -dmS <screen name>
在先前建立的分離畫面中執行命令
screen -S <screen name> -X stuff '<CMD>\n'
是的,您需要輸入回車符號來提交命令,否則它只會將字串添加到螢幕上。
答案3
這為我完成了工作,但-c
沒有工作
screen -d -m bash -c "command1; command2; command3"
答案4
測試以前答案的複製貼上方法是:
# No sessions:
screen -ls
# Returns immediately:
time screen -dmS screen_descritive_session_name bash -c 'sleep 20; hostname >> /tmp/h'
# New session present:
screen -ls
# File with return of command was created :)
sleep 20; cat /tmp/h
預期結果應類似:
No Sockets found in /var/run/screen/S-yourusernamehere.
(這意味著之前沒有創建任何螢幕會話)
real 0m0.002s
user 0m0.000s
sys 0m0.000s
(這是創建螢幕並與其分離所花費的時間。幾乎是瞬時的。)
There is a screen on:
20318.screen_descritive_session_name (20/08/2018 16:29:35) (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.
(此輸出顯示可用的螢幕會話。在最後一個命令中建立。)
sleep 20; cat /tmp/h
(這cat
顯示了在 gnu-screen 內執行的主機名稱)